
<!DOCTYPE HTML>
<html lang="" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>输入输出 · GitBook</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        
        
        
    
    <link rel="stylesheet" href="gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-intopic-toc/style.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-page-footer-ex/style/plugin.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-callouts/plugin.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-theme-comscore/test.css">
                
            
        

    

    
        
        <link rel="stylesheet" href="styles.css">
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="PA3.html" />
    
    
    <link rel="prev" href="2.4.html" />
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="Type to search" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="./">
            
                <a href="./">
            
                    
                    Introduction
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="PA0.html">
            
                <a href="PA0.html">
            
                    
                    PA0 - 世界诞生的前夜: 开发环境配置
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.1" data-path="0.1.html">
            
                <a href="0.1.html">
            
                    
                    Installing GNU/Linux
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2" data-path="0.2.html">
            
                <a href="0.2.html">
            
                    
                    First Exploration with GNU/Linux
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3" data-path="0.3.html">
            
                <a href="0.3.html">
            
                    
                    Installing Tools
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.4" data-path="0.4.html">
            
                <a href="0.4.html">
            
                    
                    Configuring vim
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.5" data-path="0.5.html">
            
                <a href="0.5.html">
            
                    
                    More Exploration
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.6" data-path="0.6.html">
            
                <a href="0.6.html">
            
                    
                    Acquiring Source Code for PAs
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="PA1.html">
            
                <a href="PA1.html">
            
                    
                    PA1 - 开天辟地的篇章: 最简单的计算机
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.1" data-path="1.1.html">
            
                <a href="1.1.html">
            
                    
                    在开始愉快的PA之旅之前
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.2" data-path="1.2.html">
            
                <a href="1.2.html">
            
                    
                    开天辟地的篇章
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.3" data-path="1.3.html">
            
                <a href="1.3.html">
            
                    
                    RTFSC
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.4" data-path="1.4.html">
            
                <a href="1.4.html">
            
                    
                    基础设施
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.5" data-path="1.5.html">
            
                <a href="1.5.html">
            
                    
                    表达式求值
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.6" data-path="1.6.html">
            
                <a href="1.6.html">
            
                    
                    监视点
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.7" data-path="1.7.html">
            
                <a href="1.7.html">
            
                    
                    如何阅读手册
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="PA2.html">
            
                <a href="PA2.html">
            
                    
                    PA2 - 简单复杂的机器: 冯诺依曼计算机系统
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.4.1" data-path="2.1.html">
            
                <a href="2.1.html">
            
                    
                    不停计算的机器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.2" data-path="2.2.html">
            
                <a href="2.2.html">
            
                    
                    RTFSC(2)
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.3" data-path="2.3.html">
            
                <a href="2.3.html">
            
                    
                    程序, 运行时环境与AM
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.4" data-path="2.4.html">
            
                <a href="2.4.html">
            
                    
                    基础设施(2)
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.4.5" data-path="2.5.html">
            
                <a href="2.5.html">
            
                    
                    输入输出
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="PA3.html">
            
                <a href="PA3.html">
            
                    
                    PA3 - 穿越时空的旅程: 批处理系统
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.1" data-path="3.1.html">
            
                <a href="3.1.html">
            
                    
                    最简单的操作系统
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2" data-path="3.2.html">
            
                <a href="3.2.html">
            
                    
                    穿越时空的旅程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.3" data-path="3.3.html">
            
                <a href="3.3.html">
            
                    
                    用户程序和系统调用
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.4" data-path="3.4.html">
            
                <a href="3.4.html">
            
                    
                    文件系统
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.5" data-path="3.5.html">
            
                <a href="3.5.html">
            
                    
                    批处理系统
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="PA4.html">
            
                <a href="PA4.html">
            
                    
                    PA4 - 虚实交错的魔法: 分时多任务
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.6.1" data-path="4.1.html">
            
                <a href="4.1.html">
            
                    
                    多道程序
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.2" data-path="4.2.html">
            
                <a href="4.2.html">
            
                    
                    虚实交错的魔法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.3" data-path="4.3.html">
            
                <a href="4.3.html">
            
                    
                    超越容量的界限
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.4" data-path="4.4.html">
            
                <a href="4.4.html">
            
                    
                    来自外部的声音
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.5" data-path="4.5.html">
            
                <a href="4.5.html">
            
                    
                    编写不朽的传奇
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="PA5.html">
            
                <a href="PA5.html">
            
                    
                    PA5 - 天下武功唯快不破: 程序与性能
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.1" data-path="5.1.html">
            
                <a href="5.1.html">
            
                    
                    浮点数的支持
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.2" data-path="5.2.html">
            
                <a href="5.2.html">
            
                    
                    通往高速的次元
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.3" data-path="5.3.html">
            
                <a href="5.3.html">
            
                    
                    天下武功唯快不破
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="blank.html">
            
                <a href="blank.html">
            
                    
                    杂项
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.8.1" data-path="why.html">
            
                <a href="why.html">
            
                    
                    为什么要学习计算机系统基础
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.2" data-path="submit.html">
            
                <a href="submit.html">
            
                    
                    实验提交要求
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.3" data-path="linux.html">
            
                <a href="linux.html">
            
                    
                    Linux入门教程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.4" data-path="man.html">
            
                <a href="man.html">
            
                    
                    man入门教程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.5" data-path="git.html">
            
                <a href="git.html">
            
                    
                    git入门教程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.6" data-path="i386-intro.html">
            
                <a href="i386-intro.html">
            
                    
                    i386手册指令集阅读指南
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.7" data-path="exec.html">
            
                <a href="exec.html">
            
                    
                    指令执行例子
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            Published with GitBook
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="." >输入输出</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h2 id="&#x8F93;&#x5165;&#x8F93;&#x51FA;">&#x8F93;&#x5165;&#x8F93;&#x51FA;</h2>
<p>&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x8FD0;&#x884C;&#x4E86;<code>cputest</code>&#x4E2D;&#x7684;&#x5404;&#x4E2A;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;, &#x4F46;&#x8FD9;&#x4E9B;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x90FD;&#x53EA;&#x80FD;&#x9ED8;&#x9ED8;&#x5730;&#x8FDB;&#x884C;&#x7EAF;&#x7CB9;&#x7684;&#x8BA1;&#x7B97;.
&#x56DE;&#x60F3;&#x8D77;&#x6211;&#x4EEC;&#x5728;&#x7A0B;&#x5E8F;&#x8BBE;&#x8BA1;&#x8BFE;&#x4E0A;&#x5199;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x7A0B;&#x5E8F;<code>hello</code>, &#x81F3;&#x5C11;&#x4E5F;&#x8F93;&#x51FA;&#x4E86;&#x4E00;&#x53E5;&#x8BDD;.
&#x4E8B;&#x5B9E;&#x4E0A;, &#x8F93;&#x5165;&#x8F93;&#x51FA;&#x662F;&#x8BA1;&#x7B97;&#x673A;&#x4E0E;&#x5916;&#x754C;&#x4EA4;&#x4E92;&#x7684;&#x57FA;&#x672C;&#x624B;&#x6BB5;,
&#x5982;&#x679C;&#x4F60;&#x8FD8;&#x8BB0;&#x5F97;&#x8BA1;&#x7B97;&#x673A;&#x521A;&#x542F;&#x52A8;&#x65F6;&#x6267;&#x884C;&#x7684;BIOS&#x7A0B;&#x5E8F;&#x7684;&#x5168;&#x79F0;&#x662F;Basic Input/Output System,
&#x4F60;&#x5C31;&#x4F1A;&#x7406;&#x89E3;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x5BF9;&#x8BA1;&#x7B97;&#x673A;&#x6765;&#x8BF4;&#x662F;&#x591A;&#x4E48;&#x91CD;&#x8981;&#x4E86;.
&#x5728;&#x771F;&#x5B9E;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x4E2D;, &#x8F93;&#x5165;&#x8F93;&#x51FA;&#x90FD;&#x662F;&#x901A;&#x8FC7;&#x8BBF;&#x95EE;I/O&#x8BBE;&#x5907;&#x6765;&#x5B8C;&#x6210;&#x7684;.</p>
<h3 id="&#x8BBE;&#x5907;&#x4E0E;cpu">&#x8BBE;&#x5907;&#x4E0E;CPU</h3>
<p>&#x8BBE;&#x5907;&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x5176;&#x5B9E;&#x6CA1;&#x4EC0;&#x4E48;&#x795E;&#x79D8;&#x7684;.
&#x4F60;&#x4F1A;&#x5728;&#x4E0D;&#x4E45;&#x7684;&#x5C06;&#x6765;&#x5728;&#x6570;&#x5B57;&#x7535;&#x8DEF;&#x5B9E;&#x9A8C;&#x4E2D;&#x770B;&#x5230;&#x952E;&#x76D8;&#x63A7;&#x5236;&#x5668;&#x6A21;&#x5757;&#x548C;VGA&#x63A7;&#x5236;&#x5668;&#x6A21;&#x5757;&#x76F8;&#x5173;&#x7684;verilog&#x4EE3;&#x7801;.
&#x5662;, &#x539F;&#x6765;&#x8FD9;&#x4E9B;&#x8BBE;&#x5907;&#x4E5F;&#x4E00;&#x6837;&#x662F;&#x4E2A;&#x6570;&#x5B57;&#x7535;&#x8DEF;!
&#x4E8B;&#x5B9E;&#x4E0A;, &#x53EA;&#x8981;&#x5411;&#x8BBE;&#x5907;&#x53D1;&#x9001;&#x4E00;&#x4E9B;&#x6709;&#x610F;&#x4E49;&#x7684;&#x6570;&#x5B57;&#x4FE1;&#x53F7;, &#x8BBE;&#x5907;&#x5C31;&#x4F1A;&#x6309;&#x7167;&#x8FD9;&#x4E9B;&#x4FE1;&#x53F7;&#x7684;&#x542B;&#x4E49;&#x6765;&#x5DE5;&#x4F5C;.
&#x8BA9;&#x4E00;&#x4E9B;&#x4FE1;&#x53F7;&#x6765;&#x6307;&#x5BFC;&#x8BBE;&#x5907;&#x5982;&#x4F55;&#x5DE5;&#x4F5C;, &#x8FD9;&#x4E0D;&#x5C31;&#x50CF;&quot;&#x7A0B;&#x5E8F;&#x7684;&#x6307;&#x4EE4;&#x6307;&#x5BFC;CPU&#x5982;&#x4F55;&#x5DE5;&#x4F5C;&quot;&#x4E00;&#x6837;&#x5417;? &#x6070;&#x6070;&#x5C31;&#x662F;&#x8FD9;&#x6837;!
&#x8BBE;&#x5907;&#x4E5F;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x72B6;&#x6001;&#x5BC4;&#x5B58;&#x5668;(&#x76F8;&#x5F53;&#x4E8E;CPU&#x7684;&#x5BC4;&#x5B58;&#x5668;), &#x4E5F;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x529F;&#x80FD;&#x90E8;&#x4EF6;(&#x76F8;&#x5F53;&#x4E8E;CPU&#x7684;&#x8FD0;&#x7B97;&#x5668;).
&#x5F53;&#x7136;&#x4E0D;&#x540C;&#x7684;&#x8BBE;&#x5907;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x529F;&#x80FD;&#x90E8;&#x4EF6;,
&#x4F8B;&#x5982;&#x952E;&#x76D8;&#x6709;&#x4E00;&#x4E2A;&#x628A;&#x6309;&#x952E;&#x7684;&#x6A21;&#x62DF;&#x4FE1;&#x53F7;&#x8F6C;&#x6362;&#x6210;&#x626B;&#x63CF;&#x7801;&#x7684;&#x90E8;&#x4EF6;,
&#x800C;VGA&#x5219;&#x6709;&#x4E00;&#x4E2A;&#x628A;&#x50CF;&#x7D20;&#x989C;&#x8272;&#x4FE1;&#x606F;&#x8F6C;&#x6362;&#x6210;&#x663E;&#x793A;&#x5668;&#x6A21;&#x62DF;&#x4FE1;&#x53F7;&#x7684;&#x90E8;&#x4EF6;.
&#x8FD9;&#x4E9B;&#x63A7;&#x5236;&#x8BBE;&#x5907;&#x5DE5;&#x4F5C;&#x7684;&#x4FE1;&#x53F7;&#x79F0;&#x4E3A;&quot;&#x547D;&#x4EE4;&#x5B57;&quot;, &#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x6210;&quot;&#x8BBE;&#x5907;&#x7684;&#x6307;&#x4EE4;&quot;,
&#x8BBE;&#x5907;&#x7684;&#x5DE5;&#x4F5C;&#x5C31;&#x662F;&#x8D1F;&#x8D23;&#x63A5;&#x6536;&#x547D;&#x4EE4;&#x5B57;, &#x5E76;&#x8FDB;&#x884C;&#x8BD1;&#x7801;&#x548C;&#x6267;&#x884C;...
&#x4F60;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;CPU&#x7684;&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;, &#x8FD9;&#x4E00;&#x5207;&#x5BF9;&#x4F60;&#x6765;&#x8BF4;&#x90FD;&#x592A;&#x719F;&#x6089;&#x4E86;.</p>
<p>&#x65E2;&#x7136;&#x8BBE;&#x5907;&#x662F;&#x7528;&#x6765;&#x8FDB;&#x884C;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x7684;, &#x6240;&#x8C13;&#x7684;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;,
&#x8BF4;&#x767D;&#x4E86;&#x5C31;&#x662F;&#x4ECE;&#x8BBE;&#x5907;&#x83B7;&#x53D6;&#x6570;&#x636E;(&#x8F93;&#x5165;), &#x6BD4;&#x5982;&#x4ECE;&#x952E;&#x76D8;&#x63A7;&#x5236;&#x5668;&#x83B7;&#x53D6;&#x6309;&#x952E;&#x626B;&#x63CF;&#x7801;,
&#x6216;&#x8005;&#x662F;&#x5411;&#x8BBE;&#x5907;&#x53D1;&#x9001;&#x6570;&#x636E;(&#x8F93;&#x51FA;), &#x6BD4;&#x5982;&#x5411;&#x663E;&#x5B58;&#x5199;&#x5165;&#x56FE;&#x50CF;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;.
&#x4F46;&#x662F;, &#x5982;&#x679C;&#x4E07;&#x4E00;&#x7528;&#x6237;&#x6CA1;&#x6709;&#x6572;&#x952E;&#x76D8;, &#x6216;&#x8005;&#x662F;&#x7528;&#x6237;&#x60F3;&#x8C03;&#x6574;&#x5C4F;&#x5E55;&#x7684;&#x5206;&#x8FA8;&#x7387;, &#x600E;&#x4E48;&#x529E;&#x5462;?
&#x8FD9;&#x8BF4;&#x660E;, &#x9664;&#x4E86;&#x7EAF;&#x7CB9;&#x7684;&#x6570;&#x636E;&#x8BFB;&#x5199;&#x4E4B;&#x5916;, &#x6211;&#x4EEC;&#x8FD8;&#x9700;&#x8981;&#x5BF9;&#x8BBE;&#x5907;&#x8FDB;&#x884C;&#x63A7;&#x5236;:
&#x6BD4;&#x5982;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x952E;&#x76D8;&#x63A7;&#x5236;&#x5668;&#x7684;&#x72B6;&#x6001;, &#x67E5;&#x770B;&#x5F53;&#x524D;&#x662F;&#x5426;&#x6709;&#x6309;&#x952E;&#x88AB;&#x6309;&#x4E0B;;
&#x6216;&#x8005;&#x662F;&#x9700;&#x8981;&#x6709;&#x65B9;&#x5F0F;&#x53EF;&#x4EE5;&#x67E5;&#x8BE2;&#x6216;&#x8BBE;&#x7F6E;VGA&#x63A7;&#x5236;&#x5668;&#x7684;&#x5206;&#x8FA8;&#x7387;.
&#x6240;&#x4EE5;, &#x5728;&#x7A0B;&#x5E8F;&#x770B;&#x6765;, &#x8BBF;&#x95EE;&#x8BBE;&#x5907; = &#x8BFB;&#x51FA;&#x6570;&#x636E; + &#x5199;&#x5165;&#x6570;&#x636E; + &#x63A7;&#x5236;&#x72B6;&#x6001;.</p>
<p>&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x8BA1;&#x7B97;&#x673A;&#x80FD;&#x591F;&#x63A7;&#x5236;&#x8BBE;&#x5907;, &#x8BA9;&#x8BBE;&#x5907;&#x505A;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x505A;&#x7684;&#x4E8B;&#x60C5;, &#x8FD9;&#x4E00;&#x91CD;&#x4EFB;&#x6BEB;&#x65E0;&#x60AC;&#x5FF5;&#x5730;&#x843D;&#x5230;&#x4E86;CPU&#x8EAB;&#x4E0A;.
CPU&#x9664;&#x4E86;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;&#x4E4B;&#x5916;, &#x8FD8;&#x9700;&#x8981;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;, &#x4E0E;&#x5176;&#x534F;&#x4F5C;&#x6765;&#x5B8C;&#x6210;&#x4E0D;&#x540C;&#x7684;&#x4EFB;&#x52A1;.
&#x90A3;&#x4E48;&#x5728;CPU&#x770B;&#x6765;, &#x8FD9;&#x4E9B;&#x884C;&#x4E3A;&#x7A76;&#x7ADF;&#x610F;&#x5473;&#x7740;&#x4EC0;&#x4E48;&#x5462;?
&#x5177;&#x4F53;&#x8981;&#x4ECE;&#x54EA;&#x91CC;&#x8BFB;&#x6570;&#x636E;? &#x628A;&#x6570;&#x636E;&#x5199;&#x5165;&#x5230;&#x54EA;&#x91CC;? &#x5982;&#x4F55;&#x67E5;&#x8BE2;/&#x8BBE;&#x7F6E;&#x8BBE;&#x5907;&#x7684;&#x72B6;&#x6001;?
&#x4E00;&#x4E2A;&#x6700;&#x672C;&#x8D28;&#x7684;&#x95EE;&#x9898;&#x662F;, CPU&#x548C;&#x8BBE;&#x5907;&#x4E4B;&#x95F4;&#x7684;&#x63A5;&#x53E3;, &#x7A76;&#x7ADF;&#x662F;&#x4EC0;&#x4E48;?</p>
<p>&#x7B54;&#x6848;&#x4E5F;&#x8BB8;&#x6BD4;&#x4F60;&#x60F3;&#x8C61;&#x4E2D;&#x7684;&#x7B80;&#x5355;&#x5F88;&#x591A;: &#x65E2;&#x7136;&#x8BBE;&#x5907;&#x4E5F;&#x6709;&#x5BC4;&#x5B58;&#x5668;,
&#x4E00;&#x79CD;&#x6700;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x6CD5;&#x5C31;&#x662F;&#x628A;&#x8BBE;&#x5907;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x4F5C;&#x4E3A;&#x63A5;&#x53E3;, &#x8BA9;CPU&#x6765;&#x8BBF;&#x95EE;&#x8FD9;&#x4E9B;&#x5BC4;&#x5B58;&#x5668;.
&#x6BD4;&#x5982;CPU&#x53EF;&#x4EE5;&#x4ECE;/&#x5F80;&#x8BBE;&#x5907;&#x7684;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x8BFB;&#x51FA;/&#x5199;&#x5165;&#x6570;&#x636E;, &#x8FDB;&#x884C;&#x6570;&#x636E;&#x7684;&#x8F93;&#x5165;&#x8F93;&#x51FA;;
&#x53EF;&#x4EE5;&#x4ECE;&#x8BBE;&#x5907;&#x7684;&#x72B6;&#x6001;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x8BFB;&#x51FA;&#x8BBE;&#x5907;&#x7684;&#x72B6;&#x6001;, &#x8BE2;&#x95EE;&#x8BBE;&#x5907;&#x662F;&#x5426;&#x5FD9;&#x788C;;
&#x6216;&#x8005;&#x5F80;&#x8BBE;&#x5907;&#x7684;&#x547D;&#x4EE4;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x5199;&#x5165;&#x547D;&#x4EE4;&#x5B57;, &#x6765;&#x4FEE;&#x6539;&#x8BBE;&#x5907;&#x7684;&#x72B6;&#x6001;.</p>
<p>&#x90A3;&#x4E48;, CPU&#x8981;&#x5982;&#x4F55;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x5462;?
&#x6211;&#x4EEC;&#x5148;&#x6765;&#x56DE;&#x987E;&#x4E00;&#x4E0B;CPU&#x662F;&#x5982;&#x4F55;&#x8BBF;&#x95EE;CPU&#x81EA;&#x5DF1;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x7684;:
&#x9996;&#x5148;&#x7ED9;&#x8FD9;&#x4E9B;&#x5BC4;&#x5B58;&#x5668;&#x7F16;&#x4E2A;&#x53F7;, &#x6BD4;&#x5982;<code>eax</code>&#x662F;<code>0</code>, <code>ecx</code>&#x662F;<code>1</code>...
&#x7136;&#x540E;&#x5728;&#x6307;&#x4EE4;&#x4E2D;&#x5F15;&#x7528;&#x8FD9;&#x4E9B;&#x7F16;&#x53F7;, &#x7535;&#x8DEF;&#x4E0A;&#x4F1A;&#x6709;&#x76F8;&#x5E94;&#x7684;&#x9009;&#x62E9;&#x5668;, &#x6765;&#x9009;&#x62E9;&#x76F8;&#x5E94;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x5E76;&#x8FDB;&#x884C;&#x8BFB;&#x5199;.
&#x5BF9;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x8BBF;&#x95EE;&#x4E5F;&#x662F;&#x7C7B;&#x4F3C;&#x7684;:
&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x7ED9;&#x8BBE;&#x5907;&#x4E2D;&#x5141;&#x8BB8;CPU&#x8BBF;&#x95EE;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x9010;&#x4E00;&#x7F16;&#x53F7;, &#x7136;&#x540E;&#x901A;&#x8FC7;&#x6307;&#x4EE4;&#x6765;&#x5F15;&#x7528;&#x8FD9;&#x4E9B;&#x7F16;&#x53F7;.
&#x8BBE;&#x5907;&#x4E2D;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x79C1;&#x6709;&#x5BC4;&#x5B58;&#x5668;, &#x5B83;&#x4EEC;&#x662F;&#x7531;&#x8BBE;&#x5907;&#x81EA;&#x5DF1;&#x7EF4;&#x62A4;&#x7684;,
&#x5B83;&#x4EEC;&#x6CA1;&#x6709;&#x8FD9;&#x6837;&#x7684;&#x7F16;&#x53F7;, CPU&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x5B83;&#x4EEC;.</p>
<p>&#x8FD9;&#x5C31;&#x662F;&#x6240;&#x8C13;&#x7684;I/O&#x7F16;&#x5740;&#x65B9;&#x5F0F;, &#x56E0;&#x6B64;&#x8FD9;&#x4E9B;&#x7F16;&#x53F7;&#x4E5F;&#x79F0;&#x4E3A;&#x8BBE;&#x5907;&#x7684;&#x5730;&#x5740;. &#x5E38;&#x7528;&#x7684;&#x7F16;&#x5740;&#x65B9;&#x5F0F;&#x6709;&#x4E24;&#x79CD;.</p>
<h3 id="&#x7AEF;&#x53E3;io">&#x7AEF;&#x53E3;I/O</h3>
<p>&#x4E00;&#x79CD;I/O&#x7F16;&#x5740;&#x65B9;&#x5F0F;&#x662F;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O(port-mapped I/O), CPU&#x4F7F;&#x7528;&#x4E13;&#x95E8;&#x7684;I/O&#x6307;&#x4EE4;&#x5BF9;&#x8BBE;&#x5907;&#x8FDB;&#x884C;&#x8BBF;&#x95EE;,
&#x5E76;&#x628A;&#x8BBE;&#x5907;&#x7684;&#x5730;&#x5740;&#x79F0;&#x4F5C;&#x7AEF;&#x53E3;&#x53F7;.
&#x6709;&#x4E86;&#x7AEF;&#x53E3;&#x53F7;&#x4EE5;&#x540E;, &#x5728;I/O&#x6307;&#x4EE4;&#x4E2D;&#x7ED9;&#x51FA;&#x7AEF;&#x53E3;&#x53F7;, &#x5C31;&#x77E5;&#x9053;&#x8981;&#x8BBF;&#x95EE;&#x54EA;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x4E86;.
&#x5E02;&#x573A;&#x4E0A;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x90FD;&#x662F;IBM PC&#x517C;&#x5BB9;&#x673A;,
IBM PC&#x517C;&#x5BB9;&#x673A;&#x5BF9;&#x5E38;&#x89C1;&#x8BBE;&#x5907;&#x7AEF;&#x53E3;&#x53F7;&#x7684;&#x5206;&#x914D;&#x6709;<a href="http://en.wikipedia.org/wiki/Input/output_base_address" target="_blank">&#x4E13;&#x95E8;&#x7684;&#x89C4;&#x5B9A;</a>.</p>
<p>x86&#x63D0;&#x4F9B;&#x4E86;<code>in</code>&#x548C;<code>out</code>&#x6307;&#x4EE4;&#x7528;&#x4E8E;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;,
&#x5176;&#x4E2D;<code>in</code>&#x6307;&#x4EE4;&#x7528;&#x4E8E;&#x5C06;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x7684;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x5230;CPU&#x5BC4;&#x5B58;&#x5668;&#x4E2D;,
<code>out</code>&#x6307;&#x4EE4;&#x7528;&#x4E8E;&#x5C06;CPU&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x7684;&#x6570;&#x636E;&#x4F20;&#x9001;&#x5230;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;.
&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x662F;&#x4F7F;&#x7528;<code>out</code>&#x6307;&#x4EE4;&#x7ED9;&#x4E32;&#x53E3;&#x53D1;&#x9001;&#x547D;&#x4EE4;&#x5B57;:</p>
<pre><code class="lang-asm">movl $0x41, %al
movl $0x3f8, %edx
outb %al, (%dx)
</code></pre>
<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x628A;&#x6570;&#x636E;0x41&#x4F20;&#x9001;&#x5230;0x3f8&#x53F7;&#x7AEF;&#x53E3;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;.
CPU&#x6267;&#x884C;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x540E;, &#x4F1A;&#x5C06;0x41&#x8FD9;&#x4E2A;&#x6570;&#x636E;&#x4F20;&#x9001;&#x5230;&#x4E32;&#x53E3;&#x7684;&#x4E00;&#x4E2A;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;,
&#x4E32;&#x53E3;&#x63A5;&#x6536;&#x4E4B;&#x540E;, &#x53D1;&#x73B0;&#x662F;&#x8981;&#x8F93;&#x51FA;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;<code>A</code>;
&#x4F46;&#x5BF9;CPU&#x6765;&#x8BF4;, &#x5B83;&#x5E76;&#x4E0D;&#x5173;&#x5FC3;&#x8BBE;&#x5907;&#x4F1A;&#x600E;&#x4E48;&#x5904;&#x7406;0x41&#x8FD9;&#x4E2A;&#x6570;&#x636E;, &#x53EA;&#x4F1A;&#x8001;&#x8001;&#x5B9E;&#x5B9E;&#x5730;&#x628A;0x41&#x4F20;&#x9001;&#x5230;0x3f8&#x53F7;&#x7AEF;&#x53E3;.
&#x4E8B;&#x5B9E;&#x4E0A;, &#x8BBE;&#x5907;&#x7684;API&#x53CA;&#x5176;&#x884C;&#x4E3A;&#x90FD;&#x4F1A;&#x5728;&#x76F8;&#x5E94;&#x7684;&#x6587;&#x6863;&#x91CC;&#x9762;&#x6709;&#x6E05;&#x6670;&#x7684;&#x5B9A;&#x4E49;,
&#x5728;PA&#x4E2D;&#x6211;&#x4EEC;&#x65E0;&#x9700;&#x4E86;&#x89E3;&#x8FD9;&#x4E9B;&#x7EC6;&#x8282;, &#x53EA;&#x9700;&#x8981;&#x77E5;&#x9053;,
&#x9A71;&#x52A8;&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;RTFM, &#x6765;&#x7F16;&#x5199;&#x76F8;&#x5E94;&#x7A0B;&#x5E8F;&#x6765;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x5373;&#x53EF;.</p>
<div class="panel panel-danger"><div class="panel-heading"><h5 class="panel-title" id="&#x6709;&#x6CA1;&#x6709;&#x4E00;&#x79CD;&#x719F;&#x6089;&#x7684;&#x611F;&#x89C9;"><i class="fa fa-bullhorn"></i> &#x6709;&#x6CA1;&#x6709;&#x4E00;&#x79CD;&#x719F;&#x6089;&#x7684;&#x611F;&#x89C9;?</h5></div><div class="panel-body"><p>API, &#x884C;&#x4E3A;, RTFM... &#x6CA1;&#x9519;, &#x6211;&#x4EEC;&#x53C8;&#x518D;&#x6B21;&#x770B;&#x5230;&#x4E86;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x8BBE;&#x8BA1;&#x7684;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;:
&#x8BBE;&#x5907;&#x5411;CPU&#x66B4;&#x9732;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x63A5;&#x53E3;, &#x628A;&#x8BBE;&#x5907;&#x5185;&#x90E8;&#x7684;&#x590D;&#x6742;&#x884C;&#x4E3A;(&#x751A;&#x81F3;&#x4E00;&#x4E9B;&#x6A21;&#x62DF;&#x7535;&#x8DEF;&#x7684;&#x7279;&#x6027;)&#x8FDB;&#x884C;&#x62BD;&#x8C61;,
CPU&#x53EA;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x8FD9;&#x4E00;&#x63A5;&#x53E3;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;, &#x5C31;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x671F;&#x671B;&#x7684;&#x529F;&#x80FD;.</p><p>&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x5904;&#x5904;&#x8574;&#x542B;&#x62BD;&#x8C61;&#x7684;&#x601D;&#x60F3;, &#x53EA;&#x8981;&#x7406;&#x89E3;&#x5176;&#x4E2D;&#x7684;&#x539F;&#x7406;,
&#x518D;&#x52A0;&#x4E0A;RTFM&#x7684;&#x6280;&#x80FD;, &#x4F60;&#x5C31;&#x80FD;&#x638C;&#x63E1;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7684;&#x5168;&#x90E8;!</p></div></div>
<h3 id="&#x5167;&#x5B58;&#x6620;&#x5C04;io">&#x5167;&#x5B58;&#x6620;&#x5C04;I/O</h3>
<p>&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x628A;&#x7AEF;&#x53E3;&#x53F7;&#x4F5C;&#x4E3A;I/O&#x6307;&#x4EE4;&#x7684;&#x4E00;&#x90E8;&#x5206;, &#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x5F88;&#x7B80;&#x5355;, &#x4F46;&#x540C;&#x65F6;&#x4E5F;&#x662F;&#x5B83;&#x6700;&#x5927;&#x7684;&#x7F3A;&#x70B9;.
&#x6307;&#x4EE4;&#x96C6;&#x4E3A;&#x4E86;&#x517C;&#x5BB9;&#x5DF2;&#x7ECF;&#x5F00;&#x53D1;&#x7684;&#x7A0B;&#x5E8F;, &#x662F;&#x53EA;&#x80FD;&#x6DFB;&#x52A0;&#x4F46;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#x7684;.
&#x8FD9;&#x610F;&#x5473;&#x7740;, &#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x6240;&#x80FD;&#x8BBF;&#x95EE;&#x7684;I/O&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x7684;&#x5927;&#x5C0F;, &#x5728;&#x8BBE;&#x8BA1;I/O&#x6307;&#x4EE4;&#x7684;&#x90A3;&#x4E00;&#x523B;&#x5C31;&#x5DF2;&#x7ECF;&#x51B3;&#x5B9A;&#x4E0B;&#x6765;&#x4E86;.
&#x6240;&#x8C13;I/O&#x5730;&#x5740;&#x7A7A;&#x95F4;, &#x5176;&#x5B9E;&#x5C31;&#x662F;&#x6240;&#x6709;&#x80FD;&#x8BBF;&#x95EE;&#x7684;&#x8BBE;&#x5907;&#x7684;&#x5730;&#x5740;&#x7684;&#x96C6;&#x5408;.
&#x968F;&#x7740;&#x8BBE;&#x5907;&#x8D8A;&#x6765;&#x8D8A;&#x591A;, &#x529F;&#x80FD;&#x4E5F;&#x8D8A;&#x6765;&#x8D8A;&#x590D;&#x6742;, I/O&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x6709;&#x9650;&#x7684;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x5DF2;&#x7ECF;&#x9010;&#x6E10;&#x4E0D;&#x80FD;&#x6EE1;&#x8DB3;&#x9700;&#x6C42;&#x4E86;.
&#x6709;&#x7684;&#x8BBE;&#x5907;&#x9700;&#x8981;&#x8BA9;CPU&#x8BBF;&#x95EE;&#x4E00;&#x6BB5;&#x8F83;&#x5927;&#x7684;&#x8FDE;&#x7EED;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;,
&#x5982;VGA&#x7684;&#x663E;&#x5B58;, 24&#x8272;&#x52A0;&#x4E0A;Alpha&#x901A;&#x9053;&#x7684;1024x768&#x5206;&#x8FA8;&#x7387;&#x7684;&#x663E;&#x5B58;&#x5C31;&#x9700;&#x8981;3MB&#x7684;&#x7F16;&#x5740;&#x8303;&#x56F4;.
&#x4E8E;&#x662F;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O(memory-mapped I/O)&#x5E94;&#x8FD0;&#x800C;&#x751F;.</p>
<p>&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x8FD9;&#x79CD;&#x7F16;&#x5740;&#x65B9;&#x5F0F;&#x975E;&#x5E38;&#x5DE7;&#x5999;, &#x5B83;&#x662F;&#x901A;&#x8FC7;&#x4E0D;&#x540C;&#x7684;&#x7269;&#x7406;&#x5185;&#x5B58;&#x5730;&#x5740;&#x7ED9;&#x8BBE;&#x5907;&#x7F16;&#x5740;&#x7684;.
&#x8FD9;&#x79CD;&#x7F16;&#x5740;&#x65B9;&#x5F0F;&#x5C06;&#x4E00;&#x90E8;&#x5206;&#x7269;&#x7406;&#x5185;&#x5B58;&quot;&#x91CD;&#x5B9A;&#x5411;&quot;&#x5230;I/O&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x4E2D;,
CPU&#x5C1D;&#x8BD5;&#x8BBF;&#x95EE;&#x8FD9;&#x90E8;&#x5206;&#x7269;&#x7406;&#x5185;&#x5B58;&#x7684;&#x65F6;&#x5019;, &#x5B9E;&#x9645;&#x4E0A;&#x6700;&#x7EC8;&#x662F;&#x8BBF;&#x95EE;&#x4E86;&#x76F8;&#x5E94;&#x7684;I/O&#x8BBE;&#x5907;, CPU&#x5374;&#x6D51;&#x7136;&#x4E0D;&#x77E5;.
&#x8FD9;&#x6837;&#x4EE5;&#x540E;, CPU&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x666E;&#x901A;&#x7684;&#x8BBF;&#x5B58;&#x6307;&#x4EE4;&#x6765;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;.
&#x8FD9;&#x4E5F;&#x662F;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x5F97;&#x5929;&#x72EC;&#x539A;&#x7684;&#x597D;&#x5904;:
&#x7269;&#x7406;&#x5185;&#x5B58;&#x7684;&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x548C;CPU&#x7684;&#x4F4D;&#x5BBD;&#x90FD;&#x4F1A;&#x4E0D;&#x65AD;&#x589E;&#x957F;, &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x4ECE;&#x6765;&#x4E0D;&#x9700;&#x8981;&#x62C5;&#x5FC3;I/O&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x8017;&#x5C3D;&#x7684;&#x95EE;&#x9898;.
&#x4ECE;&#x539F;&#x7406;&#x4E0A;&#x6765;&#x8BF4;, &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x552F;&#x4E00;&#x7684;&#x7F3A;&#x70B9;&#x5C31;&#x662F;,
CPU&#x65E0;&#x6CD5;&#x901A;&#x8FC7;&#x6B63;&#x5E38;&#x6E20;&#x9053;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x90A3;&#x4E9B;&#x88AB;&#x6620;&#x5C04;&#x5230;I/O&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x7684;&#x7269;&#x7406;&#x5185;&#x5B58;&#x4E86;.
&#x4F46;&#x968F;&#x7740;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x53D1;&#x5C55;, &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x552F;&#x4E00;&#x7F3A;&#x70B9;&#x5DF2;&#x7ECF;&#x8D8A;&#x6765;&#x8D8A;&#x4E0D;&#x660E;&#x663E;&#x4E86;:
&#x73B0;&#x4EE3;&#x8BA1;&#x7B97;&#x673A;&#x90FD;&#x5DF2;&#x7ECF;&#x662F;64&#x4F4D;&#x8BA1;&#x7B97;&#x673A;, &#x7269;&#x7406;&#x5730;&#x5740;&#x7EBF;&#x90FD;&#x6709;48&#x6839;, &#x8FD9;&#x610F;&#x5473;&#x7740;&#x7269;&#x7406;&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x6709;256TB&#x8FD9;&#x4E48;&#x5927;,
&#x4ECE;&#x91CC;&#x9762;&#x5212;&#x51FA;3MB&#x7684;&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x7ED9;&#x663E;&#x5B58;, &#x6839;&#x672C;&#x5C31;&#x662F;&#x4E0D;&#x75DB;&#x4E0D;&#x75D2;.
&#x6B63;&#x56E0;&#x4E3A;&#x5982;&#x6B64;, &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x6210;&#x4E3A;&#x4E86;&#x73B0;&#x4EE3;&#x8BA1;&#x7B97;&#x673A;&#x4E3B;&#x6D41;&#x7684;I/O&#x7F16;&#x5740;&#x65B9;&#x5F0F;:
RISC&#x67B6;&#x6784;&#x53EA;&#x63D0;&#x4F9B;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x7F16;&#x5740;&#x65B9;&#x5F0F;,
&#x800C;PCI-e, &#x7F51;&#x5361;, x86&#x7684;APIC&#x7B49;&#x4E3B;&#x6D41;&#x8BBE;&#x5907;, &#x90FD;&#x652F;&#x6301;&#x901A;&#x8FC7;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x6765;&#x8BBF;&#x95EE;.</p>
<p>&#x4F5C;&#x4E3A;RISC&#x67B6;&#x6784;, mips32&#x548C;riscv32&#x90FD;&#x662F;&#x91C7;&#x7528;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x7F16;&#x5740;&#x65B9;&#x5F0F;.
&#x5BF9;x86&#x6765;&#x8BF4;, &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x662F;NEMU&#x4E2D;&#x7684;&#x7269;&#x7406;&#x5730;&#x5740;&#x533A;&#x95F4;<code>[0xa0000000, 0xa1000000)</code>.
&#x8FD9;&#x6BB5;&#x7269;&#x7406;&#x5730;&#x5740;&#x533A;&#x95F4;&#x88AB;&#x6620;&#x5C04;&#x5230;VGA&#x5185;&#x90E8;&#x7684;&#x663E;&#x5B58;, &#x8BFB;&#x5199;&#x8FD9;&#x6BB5;&#x7269;&#x7406;&#x5730;&#x5740;&#x533A;&#x95F4;&#x5C31;&#x76F8;&#x5F53;&#x4E8E;&#x5BF9;&#x8BFB;&#x5199;VGA&#x663E;&#x5B58;&#x7684;&#x6570;&#x636E;.
&#x4F8B;&#x5982;</p>
<pre><code class="lang-c"><span class="hljs-built_in">memset</span>((<span class="hljs-keyword">void</span> *)<span class="hljs-number">0xa0000000</span>, <span class="hljs-number">0</span>, SCR_SIZE);
</code></pre>
<p>&#x4F1A;&#x5C06;&#x663E;&#x5B58;&#x4E2D;&#x4E00;&#x4E2A;&#x5C4F;&#x5E55;&#x5927;&#x5C0F;&#x7684;&#x6570;&#x636E;&#x6E05;&#x96F6;, &#x5373;&#x5F80;&#x6574;&#x4E2A;&#x5C4F;&#x5E55;&#x5199;&#x5165;&#x9ED1;&#x8272;&#x50CF;&#x7D20;, &#x4F5C;&#x7528;&#x76F8;&#x5F53;&#x4E8E;&#x6E05;&#x5C4F;.
&#x53EF;&#x4EE5;&#x770B;&#x5230;, &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x7F16;&#x7A0B;&#x6A21;&#x578B;&#x548C;&#x666E;&#x901A;&#x7684;&#x7F16;&#x7A0B;&#x5B8C;&#x5168;&#x4E00;&#x6837;:
&#x7A0B;&#x5E8F;&#x5458;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x628A;I/O&#x8BBE;&#x5907;&#x5F53;&#x505A;&#x5185;&#x5B58;&#x6765;&#x8BBF;&#x95EE;. &#x8FD9;&#x4E00;&#x7279;&#x6027;&#x4E5F;&#x662F;&#x6DF1;&#x53D7;&#x9A71;&#x52A8;&#x5F00;&#x53D1;&#x8005;&#x7684;&#x559C;&#x7231;.</p>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x7406;&#x89E3;volatile&#x5173;&#x952E;&#x5B57;"><i class="fa fa-question-circle"></i> &#x7406;&#x89E3;volatile&#x5173;&#x952E;&#x5B57;</h5></div><div class="panel-body"><p>&#x4E5F;&#x8BB8;&#x4F60;&#x4ECE;&#x6765;&#x90FD;&#x6CA1;&#x542C;&#x8BF4;&#x8FC7;C&#x8BED;&#x8A00;&#x4E2D;&#x6709;<code>volatile</code>&#x8FD9;&#x4E2A;&#x5173;&#x952E;&#x5B57;, &#x4F46;&#x5B83;&#x4ECE;C&#x8BED;&#x8A00;&#x8BDE;&#x751F;&#x5F00;&#x59CB;&#x5C31;&#x4E00;&#x76F4;&#x5B58;&#x5728;.
<code>volatile</code>&#x5173;&#x952E;&#x5B57;&#x7684;&#x4F5C;&#x7528;&#x5341;&#x5206;&#x7279;&#x522B;, &#x5B83;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x907F;&#x514D;&#x7F16;&#x8BD1;&#x5668;&#x5BF9;&#x76F8;&#x5E94;&#x4EE3;&#x7801;&#x8FDB;&#x884C;&#x4F18;&#x5316;.
&#x4F60;&#x5E94;&#x8BE5;&#x52A8;&#x624B;&#x4F53;&#x4F1A;&#x4E00;&#x4E0B;<code>volatile</code>&#x7684;&#x4F5C;&#x7528;, &#x5728;GNU/Linux&#x4E0B;&#x7F16;&#x5199;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;:</p><pre><code class="lang-c"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">fun</span><span class="hljs-params">()</span> </span>{
  <span class="hljs-keyword">extern</span> <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">char</span> _end;  <span class="hljs-comment">// _end&#x662F;&#x4EC0;&#x4E48;?</span>
  <span class="hljs-keyword">volatile</span> <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">char</span> *p = &amp;_end;
  *p = <span class="hljs-number">0</span>;
  <span class="hljs-keyword">while</span>(*p != <span class="hljs-number">0xff</span>);
  *p = <span class="hljs-number">0x33</span>;
  *p = <span class="hljs-number">0x34</span>;
  *p = <span class="hljs-number">0x86</span>;
}
</code></pre><p>&#x7136;&#x540E;&#x4F7F;&#x7528;<code>-O2</code>&#x7F16;&#x8BD1;&#x4EE3;&#x7801;.
&#x5C1D;&#x8BD5;&#x53BB;&#x6389;&#x4EE3;&#x7801;&#x4E2D;&#x7684;<code>volatile</code>&#x5173;&#x952E;&#x5B57;, &#x91CD;&#x65B0;&#x4F7F;&#x7528;<code>-O2</code>&#x7F16;&#x8BD1;, &#x5E76;&#x5BF9;&#x6BD4;&#x53BB;&#x6389;<code>volatile</code>&#x524D;&#x540E;&#x53CD;&#x6C47;&#x7F16;&#x7ED3;&#x679C;&#x7684;&#x4E0D;&#x540C;.</p><p>&#x4F60;&#x6216;&#x8BB8;&#x4F1A;&#x611F;&#x5230;&#x7591;&#x60D1;, &#x4EE3;&#x7801;&#x4F18;&#x5316;&#x4E0D;&#x662F;&#x4E00;&#x4EF6;&#x597D;&#x4E8B;&#x60C5;&#x5417;? &#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x6709;<code>volatile</code>&#x8FD9;&#x79CD;&#x5947;&#x8469;&#x7684;&#x5B58;&#x5728;?
&#x601D;&#x8003;&#x4E00;&#x4E0B;, &#x5982;&#x679C;&#x4EE3;&#x7801;&#x4E2D;<code>p</code>&#x6307;&#x5411;&#x7684;&#x5730;&#x5740;&#x6700;&#x7EC8;&#x88AB;&#x6620;&#x5C04;&#x5230;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;, &#x53BB;&#x6389;<code>volatile</code>&#x53EF;&#x80FD;&#x4F1A;&#x5E26;&#x6765;&#x4EC0;&#x4E48;&#x95EE;&#x9898;?</p></div></div>
<h2 id="nemu&#x4E2D;&#x7684;&#x8F93;&#x5165;&#x8F93;&#x51FA;">NEMU&#x4E2D;&#x7684;&#x8F93;&#x5165;&#x8F93;&#x51FA;</h2>
<p>NEMU&#x6846;&#x67B6;&#x4EE3;&#x7801;&#x4E2D;&#x5DF2;&#x7ECF;&#x63D0;&#x4F9B;&#x4E86;&#x8BBE;&#x5907;&#x7684;&#x4EE3;&#x7801;, &#x4F4D;&#x4E8E;<code>nemu/src/device/</code>&#x76EE;&#x5F55;&#x4E0B;.</p>
<h3 id="&#x6620;&#x5C04;&#x548C;io&#x65B9;&#x5F0F;">&#x6620;&#x5C04;&#x548C;I/O&#x65B9;&#x5F0F;</h3>
<p>NEMU&#x5B9E;&#x73B0;&#x4E86;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x548C;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x4E24;&#x79CD;I/O&#x7F16;&#x5740;&#x65B9;&#x5F0F;.
&#x4F46;&#x65E0;&#x8BBA;&#x662F;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x8FD8;&#x662F;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O, &#x5B83;&#x4EEC;&#x7684;&#x6838;&#x5FC3;&#x90FD;&#x662F;&#x6620;&#x5C04;.
&#x81EA;&#x7136;&#x5730;, &#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5BF9;&#x6620;&#x5C04;&#x7684;&#x7BA1;&#x7406;&#x6765;&#x5C06;&#x8FD9;&#x4E24;&#x8005;&#x7EDF;&#x4E00;&#x8D77;&#x6765;.</p>
<p>&#x5177;&#x4F53;&#x5730;, &#x6846;&#x67B6;&#x4EE3;&#x7801;&#x4E3A;&#x6620;&#x5C04;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A;&#x7ED3;&#x6784;&#x4F53;&#x7C7B;&#x578B;<code>IOMap</code>(&#x5728;<code>nemu/include/device/map.h</code>&#x4E2D;&#x5B9A;&#x4E49;),
&#x5305;&#x62EC;&#x540D;&#x5B57;, &#x6620;&#x5C04;&#x7684;&#x8D77;&#x59CB;&#x5730;&#x5740;&#x548C;&#x7ED3;&#x675F;&#x5730;&#x5740;, &#x6620;&#x5C04;&#x7684;&#x76EE;&#x6807;&#x7A7A;&#x95F4;, &#x4EE5;&#x53CA;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;.
&#x7136;&#x540E;&#x5728;<code>nemu/src/device/io/map.c</code>&#x5B9E;&#x73B0;&#x4E86;&#x6620;&#x5C04;&#x7684;&#x7BA1;&#x7406;,
&#x5305;&#x62EC;I/O&#x7A7A;&#x95F4;&#x7684;&#x5206;&#x914D;&#x53CA;&#x5176;&#x6620;&#x5C04;, &#x8FD8;&#x6709;&#x6620;&#x5C04;&#x7684;&#x8BBF;&#x95EE;&#x63A5;&#x53E3;.</p>
<p>&#x5176;&#x4E2D;<code>map_read()</code>&#x548C;<code>map_write()</code>&#x7528;&#x4E8E;&#x5C06;&#x5730;&#x5740;<code>addr</code>&#x6620;&#x5C04;&#x5230;<code>map</code>&#x6240;&#x6307;&#x793A;&#x7684;&#x76EE;&#x6807;&#x7A7A;&#x95F4;, &#x5E76;&#x8FDB;&#x884C;&#x8BBF;&#x95EE;.
&#x8BBF;&#x95EE;&#x65F6;, &#x53EF;&#x80FD;&#x4F1A;&#x89E6;&#x53D1;&#x76F8;&#x5E94;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;, &#x5BF9;&#x8BBE;&#x5907;&#x548C;&#x76EE;&#x6807;&#x7A7A;&#x95F4;&#x7684;&#x72B6;&#x6001;&#x8FDB;&#x884C;&#x66F4;&#x65B0;.
&#x7531;&#x4E8E;NEMU&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x7A0B;&#x5E8F;, &#x56E0;&#x6B64;&#x53EA;&#x80FD;&#x4E32;&#x884C;&#x6A21;&#x62DF;&#x6574;&#x4E2A;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7684;&#x5DE5;&#x4F5C;,
&#x6BCF;&#x6B21;&#x8FDB;&#x884C;I/O&#x8BFB;&#x5199;&#x7684;&#x65F6;&#x5019;, &#x624D;&#x4F1A;&#x8C03;&#x7528;&#x8BBE;&#x5907;&#x63D0;&#x4F9B;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;(callback).
&#x57FA;&#x4E8E;&#x8FD9;&#x4E24;&#x4E2A;API, &#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x5B9E;&#x73B0;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x548C;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x6A21;&#x62DF;&#x4E86;.</p>
<p><code>nemu/src/device/io/port-io.c</code>&#x662F;&#x5BF9;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x7684;&#x6A21;&#x62DF;.
<code>add_pio_map()</code>&#x51FD;&#x6570;&#x7528;&#x4E8E;&#x4E3A;&#x8BBE;&#x5907;&#x7684;&#x521D;&#x59CB;&#x5316;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O&#x7684;&#x6620;&#x5C04;&#x5173;&#x7CFB;.
<code>pio_read_[l|w|b]()</code>&#x548C;<code>pio_write_[l|w|b]()</code>&#x662F;&#x9762;&#x5411;CPU&#x7684;&#x7AEF;&#x53E3;I/O&#x8BFB;&#x5199;&#x63A5;&#x53E3;,
&#x5B83;&#x4EEC;&#x6700;&#x7EC8;&#x4F1A;&#x8C03;&#x7528;<code>map_read()</code>&#x548C;<code>map_write()</code>, &#x5BF9;&#x901A;&#x8FC7;<code>add_pio_map()</code>&#x6CE8;&#x518C;&#x7684;I/O&#x7A7A;&#x95F4;&#x8FDB;&#x884C;&#x8BBF;&#x95EE;.</p>
<p>&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x6A21;&#x62DF;&#x662F;&#x7C7B;&#x4F3C;&#x7684;, &#x53EA;&#x662F;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x8BFB;&#x5199;&#x5E76;&#x4E0D;&#x662F;&#x9762;&#x5411;CPU&#x7684;, &#x8FD9;&#x4E00;&#x70B9;&#x4F1A;&#x5728;&#x4E0B;&#x6587;&#x8FDB;&#x884C;&#x8BF4;&#x660E;.</p>
<p>NEMU&#x751A;&#x81F3;&#x628A;&#x5185;&#x5B58;&#x672C;&#x8EAB;&#x4E5F;&#x770B;&#x6210;&#x4E00;&#x79CD;&#x6620;&#x5C04;:</p>
<ul>
<li>&#x5728;<code>nemu/src/memory/memory.c</code>&#x4E2D;&#x5B9A;&#x4E49;&#x7684;<code>pmem_map</code>&#x7ED3;&#x6784;&#x4F53;, &#x628A;&#x6A21;&#x62DF;&#x5185;&#x5B58;&#x7684;&#x5927;&#x6570;&#x7EC4;<code>pmem</code>&#x4F5C;&#x4E3A;&#x76EE;&#x6807;&#x7A7A;&#x95F4;</li>
<li><code>paddr_read()</code>&#x548C;<code>paddr_write()</code>&#x6700;&#x7EC8;&#x4E5F;&#x662F;&#x901A;&#x8FC7;<code>map_read()</code>&#x548C;<code>map_write()</code>&#x6765;&#x5B9E;&#x73B0;&#x7684;</li>
</ul>
<p>&#x4E8E;&#x662F;&#x8FD9;&#x6837;&#x5C31;&#x81EA;&#x52A8;&#x5B9E;&#x73B0;&#x4E86;MMIO: &#x5982;&#x679C;&#x7269;&#x7406;&#x5730;&#x5740;&#x5C5E;&#x4E8E;&#x67D0;&#x4E2A;&#x8BBE;&#x5907;,
<code>map_read()</code>&#x548C;<code>map_write()</code>&#x5C06;&#x4F1A;&#x8BBF;&#x95EE;&#x76F8;&#x5E94;&#x7684;&#x8BBE;&#x5907;, &#x5426;&#x5219;&#x5C06;&#x4F1A;&#x8BBF;&#x95EE;&#x5185;&#x5B58;.
&#x4ECE;&#x8FD9;&#x4E2A;&#x89D2;&#x5EA6;&#x6765;&#x770B;, &#x5185;&#x5B58;&#x548C;&#x5916;&#x8BBE;&#x5728;CPU&#x6765;&#x770B;&#x5E76;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x4E0D;&#x540C;, &#x53EA;&#x4E0D;&#x8FC7;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x8282;&#x7F16;&#x5740;&#x7684;&#x5BF9;&#x8C61;&#x800C;&#x5DF2;.</p>
<h3 id="&#x8BBE;&#x5907;">&#x8BBE;&#x5907;</h3>
<p>NEMU&#x5B9E;&#x73B0;&#x4E86;&#x4E32;&#x53E3;, &#x65F6;&#x949F;, &#x952E;&#x76D8;, VGA&#x56DB;&#x79CD;&#x8BBE;&#x5907;.
&#x4E3A;&#x4E86;&#x7B80;&#x5316;&#x5B9E;&#x73B0;, &#x8FD9;&#x4E9B;&#x8BBE;&#x5907;&#x90FD;&#x662F;&#x4E0D;&#x53EF;&#x7F16;&#x7A0B;&#x7684;, &#x800C;&#x4E14;&#x53EA;&#x5B9E;&#x73B0;&#x4E86;&#x5728;NEMU&#x4E2D;&#x7528;&#x5230;&#x7684;&#x529F;&#x80FD;.</p>
<p>NEMU&#x4F7F;&#x7528;SDL&#x5E93;&#x6765;&#x5B9E;&#x73B0;&#x8BBE;&#x5907;&#x7684;&#x6A21;&#x62DF;, <code>nemu/src/device/device.c</code>&#x542B;&#x6709;&#x548C;SDL&#x5E93;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;.
<code>init_device()</code>&#x51FD;&#x6570;&#x9996;&#x5148;&#x5BF9;&#x4EE5;&#x4E0A;&#x56DB;&#x4E2A;&#x8BBE;&#x5907;&#x8FDB;&#x884C;&#x521D;&#x59CB;&#x5316;,
&#x5176;&#x4E2D;&#x5728;&#x521D;&#x59CB;&#x5316;VGA&#x65F6;&#x8FD8;&#x4F1A;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x548C;SDL&#x76F8;&#x5173;&#x7684;&#x521D;&#x59CB;&#x5316;&#x5DE5;&#x4F5C;, &#x5305;&#x62EC;&#x521B;&#x5EFA;&#x7A97;&#x53E3;, &#x8BBE;&#x7F6E;&#x663E;&#x793A;&#x6A21;&#x5F0F;&#x7B49;.
&#x6700;&#x540E;&#x8FD8;&#x4F1A;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;100Hz&#x7684;&#x5B9A;&#x65F6;&#x5668;, &#x6BCF;&#x9694;0.01&#x79D2;&#x5C31;&#x4F1A;&#x8C03;&#x7528;&#x4E00;&#x6B21;<code>device_update()</code>&#x51FD;&#x6570;.
<code>device_update()</code>&#x51FD;&#x6570;&#x4E3B;&#x8981;&#x68C0;&#x6D4B;&#x662F;&#x5426;&#x6709;&#x6309;&#x952E;&#x6309;&#x4E0B;/&#x91CA;&#x653E;, &#x4EE5;&#x53CA;&#x662F;&#x5426;&#x70B9;&#x51FB;&#x4E86;&#x7A97;&#x53E3;&#x7684;<code>X</code>&#x6309;&#x94AE;.
&#x9700;&#x8981;&#x8BF4;&#x660E;&#x7684;&#x662F;, &#x4EE3;&#x7801;&#x4E2D;&#x6CE8;&#x518C;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x662F;&#x865A;&#x62DF;&#x5B9A;&#x65F6;&#x5668;, &#x5B83;&#x53EA;&#x4F1A;&#x5728;NEMU&#x5904;&#x4E8E;&#x7528;&#x6237;&#x6001;&#x7684;&#x65F6;&#x5019;&#x8FDB;&#x884C;&#x8BA1;&#x65F6;:
&#x5982;&#x679C;NEMU&#x5728;<code>ui_mainloop()</code>&#x4E2D;&#x7B49;&#x5F85;&#x7528;&#x6237;&#x8F93;&#x5165;, &#x5B9A;&#x65F6;&#x5668;&#x5C06;&#x4E0D;&#x4F1A;&#x8BA1;&#x65F6;;
&#x5982;&#x679C;NEMU&#x8FDB;&#x884C;&#x5927;&#x91CF;&#x7684;&#x8F93;&#x51FA;, &#x5B9A;&#x65F6;&#x5668;&#x7684;&#x8BA1;&#x65F6;&#x5C06;&#x4F1A;&#x53D8;&#x5F97;&#x7F13;&#x6162;.
&#x56E0;&#x6B64;&#x9664;&#x975E;&#x4F60;&#x5728;&#x8FDB;&#x884C;&#x8C03;&#x8BD5;, &#x5426;&#x5219;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x5927;&#x91CF;&#x8F93;&#x51FA;&#x7684;&#x60C5;&#x51B5;, &#x4ECE;&#x800C;&#x5F71;&#x54CD;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5DE5;&#x4F5C;.</p>
<p>&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x7684;&#x4EE3;&#x7801;&#x662F;&#x6A21;&#x5757;&#x5316;&#x7684;, &#x8981;&#x5728;NEMU&#x4E2D;&#x52A0;&#x5165;&#x8BBE;&#x5907;&#x7684;&#x529F;&#x80FD;,
&#x4F60;&#x53EA;&#x9700;&#x8981;&#x5728;<code>nemu/include/common.h</code>&#x4E2D;&#x5B9A;&#x4E49;&#x5B8F;<code>HAS_IOE</code>.
&#x5B9A;&#x4E49;&#x540E;, <code>init_device()</code>&#x51FD;&#x6570;&#x4F1A;&#x5BF9;&#x8BBE;&#x5907;&#x8FDB;&#x884C;&#x521D;&#x59CB;&#x5316;.
&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x540E;, &#x4F60;&#x4F1A;&#x770B;&#x5230;&#x8FD0;&#x884C;NEMU&#x65F6;&#x4F1A;&#x5F39;&#x51FA;&#x4E00;&#x4E2A;&#x65B0;&#x7A97;&#x53E3;, &#x7528;&#x4E8E;&#x663E;&#x793A;VGA&#x7684;&#x8F93;&#x51FA;(&#x89C1;&#x4E0B;&#x6587;).
&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;, &#x7EC8;&#x7AEF;&#x663E;&#x793A;&#x7684;&#x63D0;&#x793A;&#x7B26;<code>(nemu)</code>&#x4ECD;&#x7136;&#x5728;&#x7B49;&#x5F85;&#x7528;&#x6237;&#x8F93;&#x5165;, &#x6B64;&#x65F6;&#x7A97;&#x53E3;&#x5E76;&#x672A;&#x663E;&#x793A;&#x4EFB;&#x4F55;&#x5185;&#x5BB9;.</p>
<h2 id="&#x5C06;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x62BD;&#x8C61;&#x6210;ioe">&#x5C06;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x62BD;&#x8C61;&#x6210;IOE</h2>
<p>&#x8BBE;&#x5907;&#x8BBF;&#x95EE;&#x7684;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x662F;&#x67B6;&#x6784;&#x76F8;&#x5173;&#x7684;, &#x6BD4;&#x5982;NEMU&#x7684;VGA&#x663E;&#x5B58;&#x4F4D;&#x4E8E;&#x7269;&#x7406;&#x5730;&#x5740;&#x533A;&#x95F4;<code>[0xa0000000, 0xa1000000)</code>,
&#x4F46;&#x5BF9;<code>native</code>&#x7684;&#x7A0B;&#x5E8F;&#x6765;&#x8BF4;, &#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x4E0D;&#x53EF;&#x8BBF;&#x95EE;&#x7684;&#x975E;&#x6CD5;&#x533A;&#x95F4;,
&#x56E0;&#x6B64;<code>native</code>&#x7A0B;&#x5E8F;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x522B;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5B9E;&#x73B0;&#x7C7B;&#x4F3C;&#x7684;&#x529F;&#x80FD;.
&#x81EA;&#x7136;&#x5730;, &#x8BBE;&#x5907;&#x8BBF;&#x95EE;&#x8FD9;&#x4E00;&#x67B6;&#x6784;&#x76F8;&#x5173;&#x7684;&#x529F;&#x80FD;, &#x5E94;&#x8BE5;&#x5F52;&#x5165;AM&#x4E2D;.
&#x4E0E;TRM&#x4E0D;&#x540C;, &#x8BBE;&#x5907;&#x8BBF;&#x95EE;&#x662F;&#x4E3A;&#x8BA1;&#x7B97;&#x673A;&#x63D0;&#x4F9B;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x7684;&#x529F;&#x80FD;,
&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x628A;&#x5B83;&#x4EEC;&#x5212;&#x5165;&#x4E00;&#x7C7B;&#x65B0;&#x7684;API, &#x540D;&#x5B57;&#x53EB;IOE(I/O Extension).</p>
<p>&#x8981;&#x5982;&#x4F55;&#x5BF9;&#x4E0D;&#x540C;&#x67B6;&#x6784;&#x7684;&#x8BBE;&#x5907;&#x8BBF;&#x95EE;&#x62BD;&#x8C61;&#x6210;&#x7EDF;&#x4E00;&#x7684;API&#x5462;?
&#x56DE;&#x60F3;&#x4E00;&#x4E0B;&#x5728;&#x7A0B;&#x5E8F;&#x770B;&#x6765;, &#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x5176;&#x5B9E;&#x60F3;&#x505A;&#x4EC0;&#x4E48;:
&#x8BBF;&#x95EE;&#x8BBE;&#x5907; = &#x8BFB;&#x51FA;&#x6570;&#x636E; + &#x5199;&#x5165;&#x6570;&#x636E; + &#x63A7;&#x5236;&#x72B6;&#x6001;.
&#x8FDB;&#x4E00;&#x6B65;&#x7684;, &#x63A7;&#x5236;&#x72B6;&#x6001;&#x672C;&#x8D28;&#x4E0A;&#x4E5F;&#x662F;&#x8BFB;/&#x5199;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x64CD;&#x4F5C;,
&#x6240;&#x4EE5;&#x8BBF;&#x95EE;&#x8BBE;&#x5907; = &#x8BFB;/&#x5199;&#x64CD;&#x4F5C;.</p>
<p>&#x5BF9;, &#x5C31;&#x662F;&#x8FD9;&#x4E48;&#x7B80;&#x5355;! &#x6240;&#x4EE5;IOE&#x63D0;&#x4F9B;&#x4E09;&#x4E2A;API:</p>
<pre><code class="lang-c"><span class="hljs-keyword">size_t</span> _io_read(<span class="hljs-keyword">uint32_t</span> dev, <span class="hljs-keyword">uintptr_t</span> reg, <span class="hljs-keyword">void</span> *buf, <span class="hljs-keyword">size_t</span> size);
<span class="hljs-keyword">size_t</span> _io_write(<span class="hljs-keyword">uint32_t</span> dev, <span class="hljs-keyword">uintptr_t</span> reg, <span class="hljs-keyword">void</span> *buf, <span class="hljs-keyword">size_t</span> size);
<span class="hljs-keyword">int</span> _ioe_init();
</code></pre>
<p>&#x524D;&#x4E24;&#x4E2A;API&#x5206;&#x522B;&#x7528;&#x4E8E;&#x4ECE;&#x7F16;&#x53F7;&#x4E3A;<code>dev</code>&#x7684;&#x8BBE;&#x5907;&#x7684;<code>reg</code>&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x8BFB;&#x51FA;<code>size</code>&#x5B57;&#x8282;&#x7684;&#x5185;&#x5BB9;&#x5230;&#x7F13;&#x51B2;&#x533A;<code>buf</code>&#x4E2D;,
&#x4EE5;&#x53CA;&#x5F80;&#x7F16;&#x53F7;&#x4E3A;<code>dev</code>&#x7684;&#x8BBE;&#x5907;&#x7684;<code>reg</code>&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x5199;&#x5165;&#x7F13;&#x51B2;&#x533A;<code>buf</code>&#x4E2D;&#x7684;<code>size</code>&#x5B57;&#x8282;&#x7684;&#x5185;&#x5BB9;.
&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;, &#x8FD9;&#x91CC;&#x7684;<code>reg</code>&#x5BC4;&#x5B58;&#x5668;&#x5E76;&#x4E0D;&#x662F;&#x4E0A;&#x6587;&#x8BA8;&#x8BBA;&#x7684;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;,
&#x56E0;&#x4E3A;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x7F16;&#x53F7;&#x662F;&#x67B6;&#x6784;&#x76F8;&#x5173;&#x7684;.
&#x5728;IOE&#x4E2D;, &#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x91C7;&#x7528;&#x4E00;&#x79CD;&#x67B6;&#x6784;&#x65E0;&#x5173;&#x7684;&quot;&#x62BD;&#x8C61;&#x5BC4;&#x5B58;&#x5668;&quot;,
&#x8FD9;&#x4E2A;<code>reg</code>&#x5176;&#x5B9E;&#x662F;&#x4E00;&#x4E2A;&#x529F;&#x80FD;&#x7F16;&#x53F7;, &#x6211;&#x4EEC;&#x7EA6;&#x5B9A;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x67B6;&#x6784;&#x4E2D;,
&#x540C;&#x4E00;&#x4E2A;&#x529F;&#x80FD;&#x7F16;&#x53F7;&#x7684;&#x542B;&#x4E49;&#x4E5F;&#x662F;&#x76F8;&#x540C;&#x7684;, &#x8FD9;&#x6837;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;&#x8BBE;&#x5907;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x62BD;&#x8C61;.
&#x6700;&#x540E;&#x4E00;&#x4E2A;API&#x7528;&#x4E8E;&#x8FDB;&#x884C;IOE&#x76F8;&#x5173;&#x7684;&#x521D;&#x59CB;&#x5316;&#x64CD;&#x4F5C;.</p>
<p><code>nexus-am/am/amdev.h</code>&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;&#x5E38;&#x89C1;&#x8BBE;&#x5907;&#x7684;ID:</p>
<pre><code class="lang-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> _DEV_INPUT   0x0000ac02 <span class="hljs-comment">// AM Virtual Input Device</span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> _DEV_TIMER   0x0000ac03 <span class="hljs-comment">// AM Virtual Timer</span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> _DEV_VIDEO   0x0000ac04 <span class="hljs-comment">// AM Virtual Video Controller</span></span>
</code></pre>
<p>&#x5934;&#x6587;&#x4EF6;&#x4E2D;&#x8FD8;&#x5B9A;&#x4E49;&#x4E86;&#x5176;&#x5B83;&#x8BBE;&#x5907;&#x7684;ID, &#x4F46;&#x5728;PA&#x4E2D;&#x6682;&#x4E0D;&#x4F7F;&#x7528;.</p>
<p>&#x5934;&#x6587;&#x4EF6;&#x4E2D;&#x8FD8;&#x5B9A;&#x4E49;&#x4E86;&#x8FD9;&#x4E9B;&#x5E38;&#x89C1;&#x8BBE;&#x5907;&#x7684;&#x62BD;&#x8C61;&#x5BC4;&#x5B58;&#x5668;&#x7F16;&#x53F7;.
&#x8FD9;&#x4E9B;&#x5B9A;&#x4E49;&#x662F;&#x67B6;&#x6784;&#x65E0;&#x5173;&#x7684;, &#x6BCF;&#x4E2A;&#x67B6;&#x6784;&#x5728;&#x5B9E;&#x73B0;&#x5404;&#x81EA;&#x7684;IOE API&#x65F6;, &#x90FD;&#x9700;&#x8981;&#x9075;&#x5FAA;&#x8FD9;&#x4E9B;&#x5B9A;&#x4E49;(&#x7EA6;&#x5B9A;).
&#x8FD9;&#x6837;, &#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x57FA;&#x4E8E;&#x8FD9;&#x5957;IOE&#x7684;API, &#x6765;&#x5B9E;&#x73B0;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x529F;&#x80FD;&#x4E86;:</p>
<pre><code class="lang-c"><span class="hljs-comment">// &#x8FD4;&#x56DE;&#x7CFB;&#x7EDF;&#x542F;&#x52A8;&#x540E;&#x7ECF;&#x8FC7;&#x7684;&#x6BEB;&#x79D2;&#x6570;</span>
<span class="hljs-keyword">uint32_t</span> uptime();
<span class="hljs-comment">// &#x5728;`rtc`&#x7ED3;&#x6784;&#x4E2D;&#x8FD4;&#x56DE;&#x5F53;&#x524D;&#x65F6;&#x95F4;, PA&#x4E2D;&#x4E0D;&#x4F1A;&#x7528;&#x5230;</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">get_timeofday</span><span class="hljs-params">(<span class="hljs-keyword">void</span> *rtc)</span></span>;
<span class="hljs-comment">// &#x8FD4;&#x56DE;&#x6309;&#x952E;&#x7684;&#x952E;&#x76D8;&#x7801;, &#x82E5;&#x65E0;&#x6309;&#x952E;, &#x5219;&#x8FD4;&#x56DE;`_KEY_NONE`</span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">read_key</span><span class="hljs-params">()</span></span>;
<span class="hljs-comment">// &#x5C06;`pixels`&#x6307;&#x5B9A;&#x7684;&#x77E9;&#x5F62;&#x50CF;&#x7D20;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E2D;&#x4EE5;`(x, y)`&#x548C;`(x+w, y+h)`&#x4E24;&#x70B9;&#x8FDE;&#x7EBF;&#x4E3A;&#x5BF9;&#x89D2;&#x7EBF;&#x7684;&#x77E9;&#x5F62;&#x533A;&#x57DF;</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">draw_rect</span><span class="hljs-params">(uint32_t *pixels, <span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y, <span class="hljs-keyword">int</span> w, <span class="hljs-keyword">int</span> h)</span></span>;
<span class="hljs-comment">// &#x5C06;&#x4E4B;&#x524D;&#x7684;&#x7ED8;&#x5236;&#x5185;&#x5BB9;&#x540C;&#x6B65;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">draw_sync</span><span class="hljs-params">()</span></span>;
<span class="hljs-comment">// &#x8FD4;&#x56DE;&#x5C4F;&#x5E55;&#x7684;&#x5BBD;&#x5EA6;</span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">screen_width</span><span class="hljs-params">()</span></span>;
<span class="hljs-comment">// &#x8FD4;&#x56DE;&#x5C4F;&#x5E55;&#x7684;&#x9AD8;&#x5EA6;</span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">screen_height</span><span class="hljs-params">()</span></span>;
</code></pre>
<p>&#x7ECF;&#x8FC7;&#x4E86;IOE&#x7684;&#x62BD;&#x8C61;, &#x4E0A;&#x8FF0;&#x529F;&#x80FD;&#x7684;&#x5B9E;&#x73B0;&#x90FD;&#x53EF;&#x4EE5;&#x662F;&#x67B6;&#x6784;&#x65E0;&#x5173;&#x7684;,
&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5C06;&#x5B83;&#x4EEC;&#x5F52;&#x5165;klib&#x4E2D;(&#x5728;<code>nexum-am/libs/klib/src/io.c</code>&#x4E2D;&#x5B9A;&#x4E49;), &#x4F9B;&#x5176;&#x5B83;&#x7A0B;&#x5E8F;&#x4F7F;&#x7528;.</p>
<p>&#x7279;&#x522B;&#x5730;, NEMU&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x5E73;&#x53F0;, &#x8BBE;&#x5907;&#x7684;&#x884C;&#x4E3A;&#x662F;&#x4E0E;ISA&#x65E0;&#x5173;&#x7684;,
&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x5728;<code>nexus-am/am/src/nemu-common/</code>&#x76EE;&#x5F55;&#x4E0B;&#x5B9E;&#x73B0;&#x4E00;&#x4EFD;IOE,
&#x6765;&#x4F9B;NEMU&#x5E73;&#x53F0;&#x7684;&#x67B6;&#x6784;&#x5171;&#x4EAB;.</p>
<h3 id="am&#x6D4B;&#x8BD5;&#x548C;&#x8FD0;&#x884C;&#x65F6;&#x73AF;&#x5883;">AM&#x6D4B;&#x8BD5;&#x548C;&#x8FD0;&#x884C;&#x65F6;&#x73AF;&#x5883;</h3>
<p>&#x5728;&#x4ECB;&#x7ECD;&#x8BBE;&#x5907;&#x529F;&#x80FD;&#x4E4B;&#x524D;, &#x6211;&#x4EEC;&#x5148;&#x4ECB;&#x7ECD;&#x4E00;&#x4E9B;&#x548C;&#x6D4B;&#x8BD5;&#x7A0B;&#x5E8F;&#x6846;&#x67B6;&#x76F8;&#x5173;&#x7684;&#x5185;&#x5BB9;.
&#x5728;AM&#x4E2D;, <code>main()</code>&#x51FD;&#x6570;&#x5141;&#x8BB8;&#x5E26;&#x6709;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x53C2;&#x6570;, &#x8FD9;&#x4E00;&#x53C2;&#x6570;&#x901A;&#x8FC7;<code>mainargs</code>&#x6307;&#x5B9A;,
&#x5E76;&#x7531;AM&#x7684;&#x8FD0;&#x884C;&#x65F6;&#x73AF;&#x5883;&#x8D1F;&#x8D23;&#x5C06;&#x5B83;&#x4F20;&#x7ED9;<code>main()</code>&#x51FD;&#x6570;, &#x4F9B;AM&#x7A0B;&#x5E8F;&#x4F7F;&#x7528;.</p>
<p>&#x5177;&#x4F53;&#x7684;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x65B9;&#x5F0F;&#x548C;&#x67B6;&#x6784;&#x76F8;&#x5173;, &#x4F8B;&#x5982;&#x5728;NEMU&#x4E2D;,
&#x8FD9;&#x4E00;&#x5B57;&#x7B26;&#x4E32;&#x901A;&#x8FC7;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#x4F20;&#x5165;, &#x7ECF;&#x7531;<code>parse_args()</code>&#x7684;&#x89E3;&#x6790;,
&#x6700;&#x540E;&#x653E;&#x5728;&#x5730;&#x5740;&#x4E3A;<code>0</code>&#x6216;<code>0x80000000</code>&#x7684;&#x5185;&#x5B58;&#x4F4D;&#x7F6E;.
&#x5728;<code>nexus-am/am/src/nemu-common/trm.c</code>&#x4E2D;,
<code>_trm_init()</code>&#x4F1A;&#x628A;&#x4E0A;&#x8FF0;&#x5730;&#x5740;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x6765;&#x8C03;&#x7528;<code>main()</code>,
&#x8FD9;&#x6837;AM&#x7A0B;&#x5E8F;&#x5C31;&#x53EF;&#x4EE5;&#x5BF9;&#x5176;&#x4E2D;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x8FDB;&#x884C;&#x53C2;&#x6570;&#x7684;&#x89E3;&#x6790;&#x4E86;.</p>
<div class="panel panel-danger"><div class="panel-heading"><h5 class="panel-title" id="bug&#x4FEE;&#x590D;"><i class="fa fa-exclamation"></i> Bug&#x4FEE;&#x590D;</h5></div><div class="panel-body"><p>&#x65E7;&#x7684;Args Rom&#x8BBE;&#x5907;&#x5B58;&#x5728;&#x4E0E;DiffTest&#x4E0D;&#x517C;&#x5BB9;&#x7684;&#x7F3A;&#x9677;, &#x6211;&#x4EEC;&#x5728;NEMU&#x4E2D;&#x53BB;&#x6389;&#x4E86;Args Rom,
&#x901A;&#x8FC7;&#x4E0A;&#x6587;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x652F;&#x6301;<code>mainargs</code>&#x673A;&#x5236;.
&#x5982;&#x679C;&#x4F60;&#x5728;2019/10/02 10:00:00&#x4E4B;&#x524D;&#x83B7;&#x53D6;&#x6846;&#x67B6;&#x4EE3;&#x7801;,
&#x8BF7;&#x6839;&#x636E;<a href="https://github.com/NJU-ProjectN/nemu/commit/9e1794ded083ec01cd0d9f92212a56d5f91c30a5" target="_blank">&#x8FD9;&#x4E2A;&#x9875;&#x9762;</a>&#x548C;<a href="https://github.com/NJU-ProjectN/nexus-am/commit/9ff62d2390deb69a22c6e0ed3073568a5c22d4d1" target="_blank">&#x8FD9;&#x4E2A;&#x9875;&#x9762;</a>&#x66F4;&#x65B0;&#x76F8;&#x5173;&#x6587;&#x4EF6;.</p></div></div>
<p>&#x6211;&#x4EEC;&#x5728;AM&#x9879;&#x76EE;&#x4E2D;&#x51C6;&#x5907;&#x4E86;&#x4E00;&#x7EC4;&#x5C0F;&#x578B;&#x6D4B;&#x8BD5;&#x7A0B;&#x5E8F;<code>amtest</code>, &#x4E13;&#x95E8;&#x7528;&#x4E8E;&#x6D4B;&#x8BD5;AM&#x76F8;&#x5173;&#x7684;&#x529F;&#x80FD;.
&#x5B83;&#x7684;<code>main()</code>&#x51FD;&#x6570;&#x63A5;&#x53D7;&#x4ECE;AM&#x7684;&#x8FD0;&#x884C;&#x65F6;&#x73AF;&#x5883;&#x4F20;&#x9012;&#x8FC7;&#x6765;&#x7684;&#x4E00;&#x4E2A;&#x53C2;&#x6570;, &#x7528;&#x4E8E;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x7A0B;&#x5E8F;&#x7684;&#x9009;&#x62E9;.
&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5148;&#x5728;<code>native</code>&#x4E0A;&#x611F;&#x53D7;&#x4E00;&#x4E0B;&#x5728;AM&#x4E2D;&#x5982;&#x4F55;&#x7ED9;<code>main()</code>&#x51FD;&#x6570;&#x4F20;&#x9012;&#x53C2;&#x6570;:
&#x5728;<code>nexus-am/tests/amtest/</code>&#x76EE;&#x5F55;&#x4E0B;&#x952E;&#x5165;</p>
<pre><code class="lang-bash">make ARCH=native mainargs=H run
</code></pre>
<p>&#x53EF;&#x4EE5;&#x8F93;&#x51FA;<code>amtest</code>&#x4E2D;&#x53EF;&#x9009;&#x7684;&#x6D4B;&#x8BD5;&#x7A0B;&#x5E8F;.
&#x66F4;&#x6362;&#x4E0D;&#x540C;&#x7684;<code>mainargs</code>&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x4E0D;&#x540C;&#x7684;&#x6D4B;&#x8BD5;.</p>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="native&#x5982;&#x4F55;&#x5B9E;&#x73B0;main&#x51FD;&#x6570;&#x7684;&#x53C2;&#x6570;&#x4F20;&#x9012;"><i class="fa fa-question-circle"></i> native&#x5982;&#x4F55;&#x5B9E;&#x73B0;main&#x51FD;&#x6570;&#x7684;&#x53C2;&#x6570;&#x4F20;&#x9012;?</h5></div><div class="panel-body"><p>&#x9605;&#x8BFB;<code>native</code>&#x7684;&#x4EE3;&#x7801;, &#x5C1D;&#x8BD5;&#x7406;&#x89E3;&#x5728;<code>make</code>&#x547D;&#x4EE4;&#x4E2D;&#x6307;&#x5B9A;&#x7684;<code>mainargs</code>
&#x662F;&#x5982;&#x4F55;&#x4F20;&#x9012;&#x7ED9;<code>main</code>&#x51FD;&#x6570;&#x7684;.</p></div></div>
<!-- -->
<p>&#x4E0B;&#x9762;&#x6211;&#x4EEC;&#x6765;&#x9010;&#x4E00;&#x4ECB;&#x7ECD;NEMU&#x4E2D;&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x7684;&#x529F;&#x80FD;.</p>
<h3 id="&#x4E32;&#x53E3;">&#x4E32;&#x53E3;</h3>
<p>&#x4E32;&#x53E3;&#x662F;&#x6700;&#x7B80;&#x5355;&#x7684;&#x8F93;&#x51FA;&#x8BBE;&#x5907;. <code>nemu/src/device/serial.c</code>&#x6A21;&#x62DF;&#x4E86;&#x4E32;&#x53E3;&#x7684;&#x529F;&#x80FD;.
&#x5176;&#x5927;&#x90E8;&#x5206;&#x529F;&#x80FD;&#x4E5F;&#x88AB;&#x7B80;&#x5316;, &#x53EA;&#x4FDD;&#x7559;&#x4E86;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;.
&#x4E32;&#x53E3;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x5206;&#x522B;&#x6CE8;&#x518C;<code>0x3F8</code>&#x5904;&#x957F;&#x5EA6;&#x4E3A;1&#x4E2A;&#x5B57;&#x8282;&#x7684;&#x7AEF;&#x53E3;,
&#x4EE5;&#x53CA;<code>0xa10003F8</code>&#x5904;&#x957F;&#x5EA6;&#x4E3A;1&#x5B57;&#x8282;&#x7684;MMIO&#x7A7A;&#x95F4;, &#x5B83;&#x4EEC;&#x90FD;&#x4F1A;&#x6620;&#x5C04;&#x5230;&#x4E32;&#x53E3;&#x7684;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;.
&#x7531;&#x4E8E;NEMU&#x4E32;&#x884C;&#x6A21;&#x62DF;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7684;&#x5DE5;&#x4F5C;, &#x4E32;&#x53E3;&#x7684;&#x72B6;&#x6001;&#x5BC4;&#x5B58;&#x5668;&#x53EF;&#x4EE5;&#x4E00;&#x76F4;&#x5904;&#x4E8E;&#x7A7A;&#x95F2;&#x72B6;&#x6001;;
&#x6BCF;&#x5F53;CPU&#x5F80;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x5199;&#x5165;&#x6570;&#x636E;&#x65F6;, &#x4E32;&#x53E3;&#x4F1A;&#x5C06;&#x6570;&#x636E;&#x4F20;&#x9001;&#x5230;&#x4E3B;&#x673A;&#x7684;&#x6807;&#x51C6;&#x8F93;&#x51FA;.</p>
<p>&#x4E8B;&#x5B9E;&#x4E0A;, &#x5728;<code>$ISA-nemu</code>&#x4E2D;, &#x6211;&#x4EEC;&#x4E4B;&#x524D;&#x63D0;&#x5230;&#x7684;<code>_putc()</code>&#x51FD;&#x6570;, &#x5C31;&#x662F;&#x901A;&#x8FC7;&#x4E32;&#x53E3;&#x8F93;&#x51FA;&#x7684;.
&#x7136;&#x800C;AM&#x5374;&#x628A;<code>_putc()</code>&#x653E;&#x5728;TRM, &#x800C;&#x4E0D;&#x662F;IOE&#x4E2D;, &#x8FD9;&#x8BA9;&#x4EBA;&#x89C9;&#x5F97;&#x6709;&#x70B9;&#x5947;&#x602A;.
&#x7684;&#x786E;, &#x53EF;&#x8BA1;&#x7B97;&#x7406;&#x8BBA;&#x4E2D;&#x63D0;&#x51FA;&#x7684;&#x6700;&#x539F;&#x59CB;&#x7684;TRM&#x5E76;&#x4E0D;&#x5305;&#x542B;&#x8F93;&#x51FA;&#x7684;&#x80FD;&#x529B;,
&#x4F46;&#x5BF9;&#x4E8E;&#x4E00;&#x4E2A;&#x73B0;&#x5B9E;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x6765;&#x8BF4;, &#x8F93;&#x51FA;&#x662F;&#x4E00;&#x4E2A;&#x6700;&#x57FA;&#x672C;&#x7684;&#x529F;&#x80FD;,
&#x6CA1;&#x6709;&#x8F93;&#x51FA;, &#x7528;&#x6237;&#x751A;&#x81F3;&#x65E0;&#x6CD5;&#x77E5;&#x9053;&#x7A0B;&#x5E8F;&#x5177;&#x4F53;&#x5728;&#x505A;&#x4EC0;&#x4E48;.
&#x56E0;&#x6B64;&#x5728;AM&#x4E2D;, <code>_putc()</code>&#x7684;&#x52A0;&#x5165;&#x8BA9;TRM&#x5177;&#x6709;&#x8F93;&#x51FA;&#x5B57;&#x7B26;&#x7684;&#x80FD;&#x529B;,
&#x88AB;&#x6269;&#x5145;&#x540E;&#x7684;TRM&#x66F4;&#x9760;&#x8FD1;&#x4E00;&#x4E2A;&#x5B9E;&#x7528;&#x7684;&#x673A;&#x5668;, &#x800C;&#x4E0D;&#x518D;&#x662F;&#x53EA;&#x4F1A;&#x8BA1;&#x7B97;&#x7684;&#x6570;&#x5B66;&#x6A21;&#x578B;.</p>
<p><code>nexus-am/am/src/nemu-common/trm.c</code>&#x4E2D;&#x5DF2;&#x7ECF;&#x63D0;&#x4F9B;&#x4E86;&#x4E32;&#x53E3;&#x7684;&#x529F;&#x80FD;.
&#x5982;&#x679C;&#x4F60;&#x9009;&#x62E9;&#x4E86;x86, &#x4E3A;&#x4E86;&#x8BA9;&#x7A0B;&#x5E8F;&#x4F7F;&#x7528;&#x4E32;&#x53E3;&#x8FDB;&#x884C;&#x8F93;&#x51FA;, &#x4F60;&#x8FD8;&#x9700;&#x8981;&#x5728;NEMU&#x4E2D;&#x5B9E;&#x73B0;&#x7AEF;&#x53E3;&#x6620;&#x5C04;I/O.</p>
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x8FD0;&#x884C;hello-world"><i class="fa fa-edit"></i> &#x8FD0;&#x884C;Hello World</h5></div><div class="panel-body"><p>&#x5982;&#x679C;&#x4F60;&#x9009;&#x62E9;&#x4E86;x86, &#x4F60;&#x9700;&#x8981;&#x5B9E;&#x73B0;<code>in</code>, <code>out</code>&#x6307;&#x4EE4;, &#x5728;&#x5B83;&#x4EEC;&#x7684;&#x6267;&#x884C;&#x8F85;&#x52A9;&#x51FD;&#x6570;&#x4E2D;&#x5206;&#x522B;&#x8C03;&#x7528;
<code>pio_read_[l|w|b]()</code>&#x548C;<code>pio_write_[l|w|b]()</code>&#x51FD;&#x6570;.
&#x5982;&#x679C;&#x4F60;&#x9009;&#x62E9;&#x7684;&#x662F;mips32&#x548C;riscv32, &#x4F60;&#x4E0D;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x989D;&#x5916;&#x7684;&#x4EE3;&#x7801;,
&#x56E0;&#x4E3A;NEMU&#x7684;&#x6620;&#x5C04;&#x673A;&#x5236;&#x5DF2;&#x7ECF;&#x652F;&#x6301;MMIO&#x4E86;.</p><p>&#x5B9E;&#x73B0;&#x540E;, &#x5728;<code>nexus-am/tests/amtest/</code>&#x76EE;&#x5F55;&#x4E0B;&#x952E;&#x5165;</p><pre><code class="lang-bash">make mainargs=h run
</code></pre><p>&#x5982;&#x679C;&#x4F60;&#x7684;&#x5B9E;&#x73B0;&#x6B63;&#x786E;, &#x4F60;&#x5C06;&#x4F1A;&#x770B;&#x5230;&#x7A0B;&#x5E8F;&#x5F80;&#x7EC8;&#x7AEF;&#x8F93;&#x51FA;&#x4E86;10&#x884C;
<code>Hello World!</code>(&#x8BF7;&#x6CE8;&#x610F;&#x4E0D;&#x8981;&#x8BA9;&#x8F93;&#x51FA;&#x6DF9;&#x6CA1;&#x5728;&#x8C03;&#x8BD5;&#x4FE1;&#x606F;&#x4E2D;).</p><p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;, &#x8FD9;&#x4E2A;hello&#x7A0B;&#x5E8F;&#x548C;&#x6211;&#x4EEC;&#x5728;&#x7A0B;&#x5E8F;&#x8BBE;&#x8BA1;&#x8BFE;&#x4E0A;&#x5199;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;hello&#x7A0B;&#x5E8F;&#x6240;&#x5904;&#x7684;&#x62BD;&#x8C61;&#x5C42;&#x6B21;&#x662F;&#x4E0D;&#x4E00;&#x6837;&#x7684;:
&#x8FD9;&#x4E2A;hello&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x8BF4;&#x662F;&#x76F4;&#x63A5;&#x8FD0;&#x884C;&#x5728;&#x88F8;&#x673A;&#x4E0A;, &#x53EF;&#x4EE5;&#x5728;AM&#x7684;&#x62BD;&#x8C61;&#x4E4B;&#x4E0A;&#x76F4;&#x63A5;&#x8F93;&#x51FA;&#x5230;&#x8BBE;&#x5907;(&#x4E32;&#x53E3;);
&#x800C;&#x6211;&#x4EEC;&#x5728;&#x7A0B;&#x5E8F;&#x8BBE;&#x8BA1;&#x8BFE;&#x4E0A;&#x5199;&#x7684;hello&#x7A0B;&#x5E8F;&#x4F4D;&#x4E8E;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4E4B;&#x4E0A;,
&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x8BBE;&#x5907;, &#x53EA;&#x80FD;&#x901A;&#x8FC7;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x63D0;&#x4F9B;&#x7684;&#x670D;&#x52A1;&#x8FDB;&#x884C;&#x8F93;&#x51FA;,
&#x8F93;&#x51FA;&#x7684;&#x6570;&#x636E;&#x8981;&#x7ECF;&#x8FC7;&#x5F88;&#x591A;&#x5C42;&#x62BD;&#x8C61;&#x624D;&#x80FD;&#x5230;&#x8FBE;&#x8BBE;&#x5907;&#x5C42;.
&#x6211;&#x4EEC;&#x4F1A;&#x5728;PA3&#x4E2D;&#x8FDB;&#x4E00;&#x6B65;&#x4F53;&#x4F1A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x4F5C;&#x7528;.</p></div></div>
<!-- -->
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x8BBE;&#x5907;&#x548C;difftest"><i class="fa fa-comment-o"></i> &#x8BBE;&#x5907;&#x548C;DiffTest</h5></div><div class="panel-body"><p>&#x7531;&#x4E8E;NEMU&#x4E2D;&#x8BBE;&#x5907;&#x7684;&#x884C;&#x4E3A;&#x662F;&#x6211;&#x4EEC;&#x81EA;&#x5B9A;&#x4E49;&#x7684;, &#x4E0E;QEMU&#x4E2D;&#x7684;&#x6807;&#x51C6;&#x8BBE;&#x5907;&#x7684;&#x884C;&#x4E3A;&#x4E0D;&#x5B8C;&#x5168;&#x4E00;&#x6837;
(&#x4F8B;&#x5982;NEMU&#x4E2D;&#x7684;&#x4E32;&#x53E3;&#x603B;&#x662F;&#x5C31;&#x7EEA;&#x7684;, &#x4F46;QEMU&#x4E2D;&#x7684;&#x4E32;&#x53E3;&#x4E5F;&#x8BB8;&#x5E76;&#x4E0D;&#x662F;&#x8FD9;&#x6837;),
&#x8FD9;&#x5BFC;&#x81F4;&#x5728;NEMU&#x4E2D;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x7684;&#x7ED3;&#x679C;&#x4E0E;QEMU&#x53EF;&#x80FD;&#x4F1A;&#x5B58;&#x5728;&#x4E0D;&#x53EF;&#x8C03;&#x6574;&#x7684;&#x504F;&#x5DEE;.
&#x4E3A;&#x4E86;&#x4F7F;&#x5F97;DiffTest&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;, &#x6846;&#x67B6;&#x4EE3;&#x7801;&#x5728;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x8C03;&#x7528;&#x4E86;<code>difftest_skip_ref()</code>&#x51FD;&#x6570;
(&#x89C1;<code>nemu/include/device/map.h</code>&#x4E2D;&#x5B9A;&#x4E49;&#x7684;<code>find_mapid_by_addr()</code>&#x51FD;&#x6570;)&#x6765;&#x8DF3;&#x8FC7;&#x4E0E;QEMU&#x7684;&#x68C0;&#x67E5;.</p></div></div>
<!-- -->
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5B9E;&#x73B0;printf"><i class="fa fa-edit"></i> &#x5B9E;&#x73B0;printf</h5></div><div class="panel-body"><p>&#x6709;&#x4E86;<code>_putc()</code>, &#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5728;klib&#x4E2D;&#x5B9E;&#x73B0;<code>printf()</code>&#x4E86;.</p><p>&#x4F60;&#x4E4B;&#x524D;&#x5DF2;&#x7ECF;&#x5B9E;&#x73B0;&#x4E86;<code>sprintf()</code>&#x4E86;, &#x5B83;&#x548C;<code>printf()</code>&#x7684;&#x529F;&#x80FD;&#x975E;&#x5E38;&#x76F8;&#x4F3C;,
&#x8FD9;&#x610F;&#x5473;&#x7740;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x4F1A;&#x6709;&#x4E0D;&#x5C11;&#x91CD;&#x590D;&#x7684;&#x4EE3;&#x7801;.
&#x4F60;&#x5DF2;&#x7ECF;&#x89C1;&#x8BC6;&#x5230;Copy-Paste&#x7F16;&#x7A0B;&#x4E60;&#x60EF;&#x7684;&#x574F;&#x5904;&#x4E86;, &#x601D;&#x8003;&#x4E00;&#x4E0B;, &#x5982;&#x4F55;&#x7B80;&#x6D01;&#x5730;&#x5B9E;&#x73B0;&#x5B83;&#x4EEC;&#x5462;?</p><p>&#x5B9E;&#x73B0;&#x4E86;<code>printf()</code>&#x4E4B;&#x540E;, &#x4F60;&#x5C31;&#x53EF;&#x4EE5;&#x5728;AM&#x7A0B;&#x5E8F;&#x4E2D;&#x4F7F;&#x7528;&#x8F93;&#x51FA;&#x8C03;&#x8BD5;&#x6CD5;&#x4E86;.</p></div></div>
<h3 id="&#x65F6;&#x949F;">&#x65F6;&#x949F;</h3>
<p>&#x6709;&#x4E86;&#x65F6;&#x949F;, &#x7A0B;&#x5E8F;&#x624D;&#x53EF;&#x4EE5;&#x63D0;&#x4F9B;&#x65F6;&#x95F4;&#x76F8;&#x5173;&#x7684;&#x4F53;&#x9A8C;, &#x4F8B;&#x5982;&#x6E38;&#x620F;&#x7684;&#x5E27;&#x7387;, &#x7A0B;&#x5E8F;&#x7684;&#x5FEB;&#x6162;&#x7B49;.
<code>nemu/src/device/timer.c</code>&#x6A21;&#x62DF;&#x4E86;i8253&#x8BA1;&#x65F6;&#x5668;&#x7684;&#x529F;&#x80FD;.
&#x8BA1;&#x65F6;&#x5668;&#x7684;&#x5927;&#x90E8;&#x5206;&#x529F;&#x80FD;&#x90FD;&#x88AB;&#x7B80;&#x5316;, &#x53EA;&#x4FDD;&#x7559;&#x4E86;&quot;&#x53D1;&#x8D77;&#x65F6;&#x949F;&#x4E2D;&#x65AD;&quot;&#x7684;&#x529F;&#x80FD;(&#x76EE;&#x524D;&#x6211;&#x4EEC;&#x4E0D;&#x4F1A;&#x7528;&#x5230;).
&#x540C;&#x65F6;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x7684;RTC(Real Time Clock).
i8253&#x8BA1;&#x65F6;&#x5668;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x5206;&#x522B;&#x6CE8;&#x518C;<code>0x48</code>&#x5904;&#x957F;&#x5EA6;&#x4E3A;4&#x4E2A;&#x5B57;&#x8282;&#x7684;&#x7AEF;&#x53E3;,
&#x4EE5;&#x53CA;<code>0xa1000048</code>&#x5904;&#x957F;&#x5EA6;&#x4E3A;4&#x5B57;&#x8282;&#x7684;MMIO&#x7A7A;&#x95F4;, &#x5B83;&#x4EEC;&#x90FD;&#x4F1A;&#x6620;&#x5C04;&#x5230;RTC&#x5BC4;&#x5B58;&#x5668;.
CPU&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x8FD9;&#x4E00;&#x5BC4;&#x5B58;&#x5668;, &#x83B7;&#x5F97;&#x5F53;&#x524D;&#x65F6;&#x95F4;(&#x5355;&#x4F4D;&#x662F;ms).</p>
<p><code>nexus-am/am/amdev.h</code>&#x4E2D;&#x4E3A;&#x65F6;&#x949F;&#x5B9A;&#x4E49;&#x4E86;&#x4E24;&#x4E2A;&#x62BD;&#x8C61;&#x5BC4;&#x5B58;&#x5668;:</p>
<ul>
<li><code>_DEVREG_TIMER_UPTIME</code>, AM&#x7CFB;&#x7EDF;&#x542F;&#x52A8;&#x65F6;&#x95F4;.
&#x4ECE;&#x4E2D;&#x8BFB;&#x51FA;<code>_DEV_TIMER_UPTIME_t</code>&#x7ED3;&#x6784;&#x4F53;, <code>(hi &lt;&lt; 32LL) | lo</code>&#x662F;&#x7CFB;&#x7EDF;&#x542F;&#x52A8;&#x7684;&#x6BEB;&#x79D2;&#x6570;.</li>
<li><code>_DEVREG_TIMER_DATE</code>, AM&#x5B9E;&#x65F6;&#x65F6;&#x949F;(RTC).
&#x4ECE;&#x4E2D;&#x8BFB;&#x51FA;<code>_DEV_TIMER_DATE_t</code>&#x7ED3;&#x6784;&#x4F53;, &#x5305;&#x542B;&#x5E74;&#x6708;&#x65E5;&#x65F6;&#x5206;&#x79D2;. PA&#x4E2D;&#x6682;&#x4E0D;&#x4F7F;&#x7528;.</li>
</ul>
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5B9E;&#x73B0;ioe"><i class="fa fa-edit"></i> &#x5B9E;&#x73B0;IOE</h5></div><div class="panel-body"><p>&#x5728;<code>nexus-am/am/src/nemu-common/nemu-timer.c</code>&#x4E2D;&#x5B9E;&#x73B0;<code>_DEVREG_TIMER_UPTIME</code>&#x7684;&#x529F;&#x80FD;.
&#x5728;<code>nexus-am/am/include/nemu.h</code>&#x548C;<code>nexus-am/am/include/$ISA.h</code>
&#x4E2D;&#x6709;&#x4E00;&#x4E9B;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;&#x4F9B;&#x4F60;&#x4F7F;&#x7528;.</p><p>&#x5B9E;&#x73B0;&#x540E;, &#x5728;<code>$ISA-nemu</code>&#x4E2D;&#x8FD0;&#x884C;<code>amtest</code>&#x4E2D;&#x7684;<code>real-time clock test</code>&#x6D4B;&#x8BD5;.
&#x5982;&#x679C;&#x4F60;&#x7684;&#x5B9E;&#x73B0;&#x6B63;&#x786E;, &#x4F60;&#x5C06;&#x4F1A;&#x770B;&#x5230;&#x7A0B;&#x5E8F;&#x6BCF;&#x9694;1&#x79D2;&#x5F80;&#x7EC8;&#x7AEF;&#x8F93;&#x51FA;&#x4E00;&#x53E5;&#x8BDD;.
&#x7531;&#x4E8E;&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x5B9E;&#x73B0;<code>_DEVREG_TIMER_DATE</code>, &#x6D4B;&#x8BD5;&#x603B;&#x662F;&#x8F93;&#x51FA;2000&#x5E74;0&#x6708;0&#x65E5;0&#x65F6;0&#x5206;0&#x79D2;,
&#x8FD9;&#x5C5E;&#x4E8E;&#x6B63;&#x5E38;&#x884C;&#x4E3A;, &#x53EF;&#x4EE5;&#x5FFD;&#x7565;.</p></div></div>
<!-- -->
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x770B;&#x770B;nemu&#x8DD1;&#x591A;&#x5FEB;"><i class="fa fa-edit"></i> &#x770B;&#x770B;NEMU&#x8DD1;&#x591A;&#x5FEB;</h5></div><div class="panel-body"><p>&#x6709;&#x4E86;&#x65F6;&#x949F;&#x4E4B;&#x540E;, &#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x6D4B;&#x8BD5;&#x4E00;&#x4E2A;&#x7A0B;&#x5E8F;&#x8DD1;&#x591A;&#x5FEB;, &#x4ECE;&#x800C;&#x6D4B;&#x8BD5;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x6027;&#x80FD;.
&#x5C1D;&#x8BD5;&#x5728;NEMU&#x4E2D;&#x4F9D;&#x6B21;&#x8FD0;&#x884C;&#x4EE5;&#x4E0B;benchmark(&#x5DF2;&#x7ECF;&#x6309;&#x7167;&#x7A0B;&#x5E8F;&#x7684;&#x590D;&#x6742;&#x5EA6;&#x6392;&#x5E8F;, &#x5747;&#x5728;<code>nexus-am/apps/</code>&#x76EE;&#x5F55;&#x4E0B;;
&#x53E6;&#x5916;&#x8DD1;&#x5206;&#x65F6;&#x8BF7;&#x6CE8;&#x91CA;&#x6389;<code>nemu/include/common.h</code>&#x4E2D;&#x7684;<code>DEBUG</code>&#x548C;<code>DIFF_TEST</code>&#x5B8F;, &#x4EE5;&#x83B7;&#x5F97;&#x8F83;&#x4E3A;&#x771F;&#x5B9E;&#x7684;&#x8DD1;&#x5206;):</p><ul>
<li>dhrystone</li>
<li>coremark</li>
<li>microbench</li>
</ul><p>&#x6210;&#x529F;&#x8FD0;&#x884C;&#x540E;&#x4F1A;&#x8F93;&#x51FA;&#x8DD1;&#x5206;. &#x5176;&#x4E2D;microbench&#x8DD1;&#x5206;&#x4EE5;<code>i7-7700K @ 4.20GHz</code>&#x7684;&#x5904;&#x7406;&#x5668;&#x4E3A;&#x53C2;&#x7167;,
<code>100000</code>&#x5206;&#x8868;&#x793A;&#x4E0E;&#x53C2;&#x7167;&#x673A;&#x5668;&#x6027;&#x80FD;&#x76F8;&#x5F53;, <code>100</code>&#x5206;&#x8868;&#x793A;&#x6027;&#x80FD;&#x4E3A;&#x53C2;&#x7167;&#x673A;&#x5668;&#x7684;&#x5343;&#x5206;&#x4E4B;&#x4E00;.
&#x9664;&#x4E86;&#x548C;&#x53C2;&#x7167;&#x673A;&#x5668;&#x6BD4;&#x8F83;&#x4E4B;&#x5916;, &#x4E5F;&#x53EF;&#x4EE5;&#x548C;&#x5C0F;&#x4F19;&#x4F34;&#x8FDB;&#x884C;&#x6BD4;&#x8F83;.
&#x5982;&#x679C;&#x628A;&#x4E0A;&#x8FF0;benchmark&#x7F16;&#x8BD1;&#x5230;<code>native</code>, &#x8FD8;&#x53EF;&#x4EE5;&#x6BD4;&#x8F83;<code>native</code>&#x7684;&#x6027;&#x80FD;.</p><p>&#x53E6;&#x5916;, microbench&#x63D0;&#x4F9B;&#x4E86;&#x4E09;&#x4E2A;&#x4E0D;&#x540C;&#x89C4;&#x6A21;&#x7684;&#x6D4B;&#x8BD5;&#x96C6;, &#x5305;&#x62EC;<code>test</code>, <code>train</code>&#x548C;<code>ref</code>.
&#x5176;&#x4E2D;<code>ref</code>&#x6D4B;&#x8BD5;&#x96C6;&#x89C4;&#x6A21;&#x8F83;&#x5927;, &#x8BA1;&#x65F6;&#x8BA1;&#x5206;, &#x7528;&#x4E8E;&#x8DD1;&#x5206;&#x6D4B;&#x8BD5;, &#x9ED8;&#x8BA4;&#x4F1A;&#x8FD0;&#x884C;<code>ref</code>&#x6D4B;&#x8BD5;&#x96C6;;
<code>test</code>&#x6D4B;&#x8BD5;&#x96C6;&#x89C4;&#x6A21;&#x8F83;&#x5C0F;, &#x4E0D;&#x8BA1;&#x65F6;&#x4E0D;&#x8BA1;&#x5206;, &#x7528;&#x4E8E;&#x6B63;&#x786E;&#x6027;&#x6D4B;&#x8BD5;;
<code>train</code>&#x6D4B;&#x8BD5;&#x96C6;&#x89C4;&#x6A21;&#x4E2D;&#x7B49;, &#x8BA1;&#x65F6;&#x4E0D;&#x8BA1;&#x5206;, &#x4E13;&#x95E8;&#x7528;&#x4E8E;&#x5904;&#x7406;&#x5668;&#x8BBE;&#x8BA1;&#x7684;&#x4EFF;&#x771F;&#x6D4B;&#x8BD5;;
&#x82E5;&#x8981;&#x8FD0;&#x884C;<code>test</code>&#x6D4B;&#x8BD5;&#x96C6;&#x6216;<code>train</code>&#x6D4B;&#x8BD5;&#x96C6;, &#x9700;&#x8981;&#x901A;&#x8FC7;<code>mainargs</code>&#x6307;&#x5B9A;:</p><pre><code class="lang-bash">make run mainargs=<span class="hljs-built_in">test</span>
</code></pre></div></div>
<!-- -->
<div class="panel panel-danger"><div class="panel-heading"><h5 class="panel-title" id="&#x5148;&#x5B8C;&#x6210;-&#x540E;&#x5B8C;&#x7F8E;---&#x6291;&#x5236;&#x4F4F;&#x4F18;&#x5316;&#x4EE3;&#x7801;&#x7684;&#x51B2;&#x52A8;"><i class="fa fa-bullhorn"></i> &#x5148;&#x5B8C;&#x6210;, &#x540E;&#x5B8C;&#x7F8E; - &#x6291;&#x5236;&#x4F4F;&#x4F18;&#x5316;&#x4EE3;&#x7801;&#x7684;&#x51B2;&#x52A8;</h5></div><div class="panel-body"><p>&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;&#x8FC7;&#x7A0B;&#x53EF;&#x4EE5;&#x6982;&#x62EC;&#x6210;&#x4E24;&#x4EF6;&#x4E8B;:</p><ol>
<li>&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x529F;&#x80FD;&#x6B63;&#x786E;&#x7684;&#x5B8C;&#x6574;&#x7CFB;&#x7EDF; (&#x5148;&#x5B8C;&#x6210;)</li>
<li>&#x5728;&#x7B2C;1&#x70B9;&#x7684;&#x57FA;&#x7840;&#x4E0A;, &#x8BA9;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x5F97;&#x66F4;&#x5FEB; (&#x540E;&#x5B8C;&#x7F8E;)</li>
</ol><p>&#x770B;&#x5230;&#x8DD1;&#x5206;&#x4E4B;&#x540E;, &#x4F60;&#x4E5F;&#x8BB8;&#x4F1A;&#x5FCD;&#x4E0D;&#x4F4F;&#x53BB;&#x601D;&#x8003;&#x5982;&#x4F55;&#x4F18;&#x5316;&#x4F60;&#x7684;NEMU.
&#x4E0A;&#x8FF0;&#x539F;&#x5219;&#x544A;&#x8BC9;&#x4F60;, &#x65F6;&#x673A;&#x8FD8;&#x6CA1;&#x5230;.
&#x4E00;&#x4E2A;&#x539F;&#x56E0;&#x662F;, &#x5728;&#x6574;&#x4E2A;&#x7CFB;&#x7EDF;&#x5B8C;&#x6210;&#x4E4B;&#x524D;, &#x4F60;&#x5F88;&#x96BE;&#x5224;&#x65AD;&#x7CFB;&#x7EDF;&#x7684;&#x6027;&#x80FD;&#x74F6;&#x9888;&#x4F1A;&#x51FA;&#x73B0;&#x5728;&#x54EA;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x4E2D;.
&#x4F60;&#x4E00;&#x5F00;&#x59CB;&#x8F9B;&#x8F9B;&#x82E6;&#x82E6;&#x8FFD;&#x6C42;&#x7684;&#x5B8C;&#x7F8E;, &#x6700;&#x540E;&#x5BF9;&#x6574;&#x4E2A;&#x7CFB;&#x7EDF;&#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;&#x4E5F;&#x8BB8;&#x53EA;&#x662F;&#x4E5D;&#x725B;&#x4E00;&#x6BDB;, &#x6839;&#x672C;&#x4E0D;&#x503C;&#x5F97;&#x4F60;&#x82B1;&#x8D39;&#x8FD9;&#x4E48;&#x591A;&#x65F6;&#x95F4;.
&#x6BD4;&#x5982;&#x4F60;&#x53EF;&#x80FD;&#x5728;PA1&#x4E2D;&#x82B1;&#x65F6;&#x95F4;&#x53BB;&#x4F18;&#x5316;&#x8868;&#x8FBE;&#x5F0F;&#x6C42;&#x503C;&#x7684;&#x7B97;&#x6CD5;, &#x4F60;&#x53EF;&#x4EE5;&#x4EE5;&#x6B64;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x7F16;&#x7A0B;&#x7EC3;&#x4E60;,
&#x4F46;&#x5982;&#x679C;&#x4F60;&#x7684;&#x521D;&#x8877;&#x662F;&#x4E3A;&#x4E86;&#x4F18;&#x5316;&#x6027;&#x80FD;, &#x4F60;&#x7684;&#x4ED8;&#x51FA;&#x7EDD;&#x5BF9;&#x662F;&#x6CA1;&#x6709;&#x6548;&#x679C;&#x7684;:
&#x4F60;&#x5F97;&#x8F93;&#x5165;&#x591A;&#x957F;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#x624D;&#x80FD;&#x8BA9;&#x4F60;&#x660E;&#x663E;&#x611F;&#x89C9;&#x5230;&#x65B0;&#x7B97;&#x6CD5;&#x7684;&#x6027;&#x80FD;&#x4F18;&#x52BF;?</p><p>&#x6B64;&#x5916;, PA&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x6559;&#x5B66;&#x5B9E;&#x9A8C;, &#x53EA;&#x8981;&#x6027;&#x80FD;&#x4E0D;&#x662F;&#x5DEE;&#x5F97;&#x65E0;&#x6CD5;&#x63A5;&#x53D7;,
&#x6027;&#x80FD;&#x90FD;&#x4E0D;&#x662F;&#x4F60;&#x9700;&#x8981;&#x8003;&#x8651;&#x7684;&#x9996;&#x8981;&#x76EE;&#x6807;, &#x5B9E;&#x73B0;&#x65B9;&#x6848;&#x70B9;&#x5230;&#x4E3A;&#x6B62;&#x5373;&#x53EF;.
&#x76F8;&#x6BD4;&#x4E4B;&#x4E0B;, &#x901A;&#x8FC7;&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x7CFB;&#x7EDF;&#x6765;&#x4F53;&#x4F1A;&#x7A0B;&#x5E8F;&#x5982;&#x4F55;&#x8FD0;&#x884C;, &#x5BF9;&#x4F60;&#x6765;&#x8BF4;&#x624D;&#x662F;&#x6700;&#x91CD;&#x8981;&#x7684;.</p><p>&#x4E8B;&#x5B9E;&#x4E0A;, &#x9664;&#x4E86;&#x8BA1;&#x7B97;&#x673A;, &quot;&#x5148;&#x5B8C;&#x6210;, &#x540E;&#x5B8C;&#x7F8E;&quot;&#x7684;&#x539F;&#x5219;&#x4E5F;&#x9002;&#x7528;&#x4E8E;&#x5F88;&#x591A;&#x9886;&#x57DF;.
&#x6BD4;&#x5982;&#x4F01;&#x4E1A;&#x65B9;&#x6848;&#x7B56;&#x5212;, &#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x5728;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x4F46;&#x54EA;&#x6015;&#x5F88;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x6848;&#x4E0A;&#x8FED;&#x4EE3;;
&#x4F46;&#x5982;&#x679C;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x60F3;&#x7740;&#x628A;&#x6BCF;&#x4E00;&#x4E2A;&#x70B9;&#x90FD;&#x505A;&#x5230;&#x5B8C;&#x7F8E;, &#x6700;&#x540E;&#x5F88;&#x53EF;&#x80FD;&#x8FDE;&#x4E00;&#x4EFD;&#x5B8C;&#x6574;&#x7684;&#x65B9;&#x6848;&#x4E5F;&#x62FF;&#x4E0D;&#x51FA;&#x624B;.
&#x8BBA;&#x6587;&#x5199;&#x4F5C;&#x4E5F;&#x4E00;&#x6837;, &#x54EA;&#x6015;&#x662F;&#x53EA;&#x6709;&#x5B8C;&#x6574;&#x7684;&#x5C0F;&#x6807;&#x9898;, &#x5927;&#x5BB6;&#x90FD;&#x53EF;&#x4EE5;&#x53BB;&#x68C0;&#x67E5;&#x6587;&#x7AE0;&#x7684;&#x6574;&#x4F53;&#x6846;&#x67B6;&#x6709;&#x65E0;&#x903B;&#x8F91;&#x6F0F;&#x6D1E;;
&#x76F8;&#x53CD;, &#x5C31;&#x7B97;&#x6587;&#x7AE0;&#x914D;&#x6709;&#x518D;&#x6F02;&#x4EAE;&#x7684;&#x5B9E;&#x9A8C;&#x6570;&#x636E;, &#x5728;&#x6709;&#x6F0F;&#x6D1E;&#x7684;&#x903B;&#x8F91;&#x9762;&#x524D;&#x4E5F;&#x65E0;&#x6CD5;&#x81EA;&#x5706;&#x5176;&#x8BF4;.</p><p>&#x968F;&#x7740;&#x4F60;&#x53C2;&#x4E0E;&#x8D8A;&#x6765;&#x8D8A;&#x5927;&#x7684;&#x9879;&#x76EE;, &#x4F60;&#x4F1A;&#x53D1;&#x73B0;&#x8BA9;&#x5B8C;&#x6574;&#x7684;&#x7CFB;&#x7EDF;&#x6B63;&#x786E;&#x5730;&#x8DD1;&#x8D77;&#x6765;, &#x4F1A;&#x53D8;&#x5F97;&#x8D8A;&#x6765;&#x8D8A;&#x96BE;.
&#x8FD9;&#x65F6;&#x5019;, &#x9075;&#x5FAA;&quot;&#x5148;&#x5B8C;&#x6210;, &#x540E;&#x5B8C;&#x7F8E;&quot;&#x7684;&#x539F;&#x5219;&#x5C31;&#x663E;&#x5F97;&#x66F4;&#x91CD;&#x8981;&#x4E86;:
&#x5F88;&#x591A;&#x95EE;&#x9898;&#x4E5F;&#x8BB8;&#x4F1A;&#x7B49;&#x5230;&#x9879;&#x76EE;&#x8D8B;&#x4E8E;&#x5B8C;&#x6574;&#x7684;&#x65F6;&#x5019;&#x624D;&#x4F1A;&#x66B4;&#x9732;&#x51FA;&#x6765;,
&#x820D;&#x5F03;&#x5168;&#x5C40;&#x7684;&#x5B8C;&#x6574;&#x800C;&#x6362;&#x6765;&#x5C40;&#x90E8;&#x7684;&#x5B8C;&#x7F8E;, &#x5927;&#x591A;&#x65F6;&#x5019;&#x53EA;&#x4F1A;&#x5357;&#x8F95;&#x5317;&#x8F99;.</p></div></div>
<h3 id="&#x952E;&#x76D8;">&#x952E;&#x76D8;</h3>
<p>&#x952E;&#x76D8;&#x662F;&#x6700;&#x57FA;&#x672C;&#x7684;&#x8F93;&#x5165;&#x8BBE;&#x5907;.
&#x4E00;&#x822C;&#x952E;&#x76D8;&#x7684;&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;&#x5982;&#x4E0B;: &#x5F53;&#x6309;&#x4E0B;&#x4E00;&#x4E2A;&#x952E;&#x7684;&#x65F6;&#x5019;, &#x952E;&#x76D8;&#x5C06;&#x4F1A;&#x53D1;&#x9001;&#x8BE5;&#x952E;&#x7684;&#x901A;&#x7801;(make code);
&#x5F53;&#x91CA;&#x653E;&#x4E00;&#x4E2A;&#x952E;&#x7684;&#x65F6;&#x5019;, &#x952E;&#x76D8;&#x5C06;&#x4F1A;&#x53D1;&#x9001;&#x8BE5;&#x952E;&#x7684;&#x65AD;&#x7801;(break code).
<code>nemu/src/device/keyboard.c</code>&#x6A21;&#x62DF;&#x4E86;i8042&#x901A;&#x7528;&#x8BBE;&#x5907;&#x63A5;&#x53E3;&#x82AF;&#x7247;&#x7684;&#x529F;&#x80FD;.
&#x5176;&#x5927;&#x90E8;&#x5206;&#x529F;&#x80FD;&#x4E5F;&#x88AB;&#x7B80;&#x5316;, &#x53EA;&#x4FDD;&#x7559;&#x4E86;&#x952E;&#x76D8;&#x63A5;&#x53E3;.
i8042&#x82AF;&#x7247;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x5206;&#x522B;&#x6CE8;&#x518C;<code>0x60</code>&#x5904;&#x957F;&#x5EA6;&#x4E3A;4&#x4E2A;&#x5B57;&#x8282;&#x7684;&#x7AEF;&#x53E3;,
&#x4EE5;&#x53CA;<code>0xa1000060</code>&#x5904;&#x957F;&#x5EA6;&#x4E3A;4&#x5B57;&#x8282;&#x7684;MMIO&#x7A7A;&#x95F4;, &#x5B83;&#x4EEC;&#x90FD;&#x4F1A;&#x6620;&#x5C04;&#x5230;i8042&#x7684;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;.
&#x6BCF;&#x5F53;&#x7528;&#x6237;&#x6572;&#x4E0B;/&#x91CA;&#x653E;&#x6309;&#x952E;&#x65F6;, &#x5C06;&#x4F1A;&#x628A;&#x76F8;&#x5E94;&#x7684;&#x952E;&#x76D8;&#x7801;&#x653E;&#x5165;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;,
CPU&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;, &#x83B7;&#x5F97;&#x952E;&#x76D8;&#x7801;; &#x5F53;&#x65E0;&#x6309;&#x952E;&#x53EF;&#x83B7;&#x53D6;&#x65F6;, &#x5C06;&#x4F1A;&#x8FD4;&#x56DE;<code>_KEY_NONE</code>.
&#x5728;AM&#x4E2D;, &#x6211;&#x4EEC;&#x7EA6;&#x5B9A;&#x901A;&#x7801;&#x7684;&#x503C;&#x4E3A;<code>&#x65AD;&#x7801; | 0x8000</code>.</p>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x795E;&#x79D8;&#x7684;map&#x5B8F;"><i class="fa fa-question-circle"></i> &#x795E;&#x79D8;&#x7684;MAP&#x5B8F;</h5></div><div class="panel-body"><p>&#x6846;&#x67B6;&#x4EE3;&#x7801;&#x5728;<code>nemu/include/macro.h</code>&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A;<code>MAP</code>&#x5B8F;,
&#x5E76;&#x5728;<code>nemu/src/device/kerboard.c</code>&#x4E2D;&#x4F7F;&#x7528;&#x4E86;&#x5B83;.
&#x4F60;&#x80FD;&#x660E;&#x767D;&#x5B83;&#x662F;&#x5982;&#x4F55;&#x5DE5;&#x4F5C;&#x7684;&#x5417;?</p></div></div>
<!-- -->
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x5982;&#x4F55;&#x68C0;&#x6D4B;&#x591A;&#x4E2A;&#x952E;&#x540C;&#x65F6;&#x88AB;&#x6309;&#x4E0B;"><i class="fa fa-question-circle"></i> &#x5982;&#x4F55;&#x68C0;&#x6D4B;&#x591A;&#x4E2A;&#x952E;&#x540C;&#x65F6;&#x88AB;&#x6309;&#x4E0B;?</h5></div><div class="panel-body"><p>&#x5728;&#x6E38;&#x620F;&#x4E2D;, &#x5F88;&#x591A;&#x65F6;&#x5019;&#x9700;&#x8981;&#x5224;&#x65AD;&#x73A9;&#x5BB6;&#x662F;&#x5426;&#x540C;&#x65F6;&#x6309;&#x4E0B;&#x4E86;&#x591A;&#x4E2A;&#x952E;,
&#x4F8B;&#x5982;RPG&#x6E38;&#x620F;&#x4E2D;&#x7684;&#x516B;&#x65B9;&#x5411;&#x884C;&#x8D70;, &#x683C;&#x6597;&#x6E38;&#x620F;&#x4E2D;&#x7684;&#x7EC4;&#x5408;&#x62DB;&#x5F0F;&#x7B49;&#x7B49;.
&#x6839;&#x636E;&#x952E;&#x76D8;&#x7801;&#x7684;&#x7279;&#x6027;, &#x4F60;&#x77E5;&#x9053;&#x8FD9;&#x4E9B;&#x529F;&#x80FD;&#x662F;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x7684;&#x5417;?</p></div></div>
<p><code>nexus-am/am/amdev.h</code>&#x4E2D;&#x4E3A;&#x952E;&#x76D8;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x5BC4;&#x5B58;&#x5668;:</p>
<ul>
<li><code>_DEVREG_INPUT_KBD</code>, AM&#x952E;&#x76D8;&#x63A7;&#x5236;&#x5668;.
&#x4ECE;&#x4E2D;&#x8BFB;&#x51FA;<code>_DEV_INPUT_KBD_t</code>&#x7ED3;&#x6784;&#x4F53;, <code>keydown = 1</code>&#x4E3A;&#x6309;&#x4E0B;&#x6309;&#x952E;, <code>keydown = 0</code>&#x4E3A;&#x91CA;&#x653E;&#x6309;&#x952E;.
<code>keycode</code>&#x4E3A;&#x6309;&#x952E;&#x7684;&#x65AD;&#x7801;, &#x6CA1;&#x6709;&#x6309;&#x952E;&#x65F6;, <code>keycode</code>&#x4E3A;<code>_KEY_NONE</code>.</li>
</ul>
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5B9E;&#x73B0;ioe2"><i class="fa fa-edit"></i> &#x5B9E;&#x73B0;IOE(2)</h5></div><div class="panel-body"><p>&#x5728;<code>nexus-am/am/src/nemu-common/nemu-input.c</code>&#x4E2D;&#x5B9E;&#x73B0;<code>_DEVREG_INPUT_KBD</code>&#x7684;&#x529F;&#x80FD;.
&#x5B9E;&#x73B0;&#x540E;, &#x5728;<code>$ISA-nemu</code>&#x4E2D;&#x8FD0;&#x884C;<code>amtest</code>&#x4E2D;&#x7684;<code>readkey test</code>&#x6D4B;&#x8BD5;.
&#x5982;&#x679C;&#x4F60;&#x7684;&#x5B9E;&#x73B0;&#x6B63;&#x786E;, &#x5728;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x65F6;&#x5F39;&#x51FA;&#x7684;&#x65B0;&#x7A97;&#x53E3;&#x4E2D;&#x6309;&#x4E0B;&#x6309;&#x952E;,
&#x4F60;&#x5C06;&#x4F1A;&#x770B;&#x5230;&#x7A0B;&#x5E8F;&#x8F93;&#x51FA;&#x76F8;&#x5E94;&#x7684;&#x6309;&#x952E;&#x4FE1;&#x606F;, &#x5305;&#x62EC;&#x6309;&#x952E;&#x540D;, &#x952E;&#x76D8;&#x7801;, &#x4EE5;&#x53CA;&#x6309;&#x952E;&#x72B6;&#x6001;.</p></div></div>
<h3 id="vga">VGA</h3>
<p>VGA&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x663E;&#x793A;&#x989C;&#x8272;&#x50CF;&#x7D20;, &#x662F;&#x6700;&#x5E38;&#x7528;&#x7684;&#x8F93;&#x51FA;&#x8BBE;&#x5907;.
<code>nemu/src/device/vga.c</code>&#x6A21;&#x62DF;&#x4E86;VGA&#x7684;&#x529F;&#x80FD;.
VGA&#x521D;&#x59CB;&#x5316;&#x65F6;&#x6CE8;&#x518C;&#x4E86;&#x4ECE;<code>0xa0000000</code>&#x5F00;&#x59CB;&#x7684;&#x4E00;&#x6BB5;&#x7528;&#x4E8E;&#x6620;&#x5C04;&#x5230;video memory&#x7684;MMIO&#x7A7A;&#x95F4;.
&#x4EE3;&#x7801;&#x53EA;&#x6A21;&#x62DF;&#x4E86;<code>400x300x32</code>&#x7684;&#x56FE;&#x5F62;&#x6A21;&#x5F0F;, &#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x5360;32&#x4E2A;bit&#x7684;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;,
R(red), G(green), B(blue), A(alpha)&#x5404;&#x5360;8 bit, &#x5176;&#x4E2D;VGA&#x4E0D;&#x4F7F;&#x7528;alpha&#x7684;&#x4FE1;&#x606F;.
&#x5982;&#x679C;&#x4F60;&#x5BF9;VGA&#x7F16;&#x7A0B;&#x611F;&#x5174;&#x8DA3;, <a href="http://www.scs.stanford.edu/10wi-cs210/pintos/specs/freevga/home.htm" target="_blank">&#x8FD9;&#x91CC;</a>&#x6709;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;FreeVGA&#x7684;&#x9879;&#x76EE;,
&#x91CC;&#x9762;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;VGA&#x7684;&#x76F8;&#x5173;&#x8D44;&#x6599;.</p>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x795E;&#x5947;&#x7684;&#x8C03;&#x8272;&#x677F;"><i class="fa fa-question-circle"></i> &#x795E;&#x5947;&#x7684;&#x8C03;&#x8272;&#x677F;</h5></div><div class="panel-body"><p>&#x73B0;&#x4EE3;&#x7684;&#x663E;&#x793A;&#x5668;&#x4E00;&#x822C;&#x90FD;&#x652F;&#x6301;24&#x4F4D;&#x7684;&#x989C;&#x8272;(R, G, B&#x5404;&#x5360;8&#x4E2A;bit, &#x5171;&#x6709;<code>2^8*2^8*2^8</code>&#x7EA6;1600&#x4E07;&#x79CD;&#x989C;&#x8272;),
&#x4E3A;&#x4E86;&#x8BA9;&#x5C4F;&#x5E55;&#x663E;&#x793A;&#x4E0D;&#x540C;&#x7684;&#x989C;&#x8272;&#x6210;&#x4E3A;&#x53EF;&#x80FD;, &#x5728;8&#x4F4D;&#x989C;&#x8272;&#x6DF1;&#x5EA6;&#x65F6;&#x4F1A;&#x4F7F;&#x7528;&#x8C03;&#x8272;&#x677F;&#x7684;&#x6982;&#x5FF5;.
&#x8C03;&#x8272;&#x677F;&#x662F;&#x4E00;&#x4E2A;&#x989C;&#x8272;&#x4FE1;&#x606F;&#x7684;&#x6570;&#x7EC4;, &#x6BCF;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x5360;4&#x4E2A;&#x5B57;&#x8282;,
&#x5206;&#x522B;&#x4EE3;&#x8868;R(red), G(green), B(blue), A(alpha)&#x7684;&#x503C;.
&#x5F15;&#x5165;&#x4E86;&#x8C03;&#x8272;&#x677F;&#x7684;&#x6982;&#x5FF5;&#x4E4B;&#x540E;, &#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x5B58;&#x50A8;&#x7684;&#x5C31;&#x4E0D;&#x518D;&#x662F;&#x989C;&#x8272;&#x7684;&#x4FE1;&#x606F;, &#x800C;&#x662F;&#x4E00;&#x4E2A;&#x8C03;&#x8272;&#x677F;&#x7684;&#x7D22;&#x5F15;:
&#x5177;&#x4F53;&#x6765;&#x8BF4;, &#x8981;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;, &#x5C31;&#x8981;&#x628A;&#x5B83;&#x7684;&#x503C;&#x5F53;&#x4F5C;&#x4E0B;&#x6807;,
&#x5728;&#x8C03;&#x8272;&#x677F;&#x8FD9;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x505A;&#x4E0B;&#x6807;&#x8FD0;&#x7B97;, &#x53D6;&#x51FA;&#x76F8;&#x5E94;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;.
&#x56E0;&#x6B64;, &#x53EA;&#x8981;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x8C03;&#x8272;&#x677F;, &#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x65F6;&#x523B;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x7684;256&#x79CD;&#x989C;&#x8272;&#x4E86;.</p><p>&#x5728;&#x4E00;&#x4E9B;90&#x5E74;&#x4EE3;&#x7684;&#x6E38;&#x620F;&#x4E2D;, &#x5F88;&#x591A;&#x6E10;&#x51FA;&#x6E10;&#x5165;&#x6548;&#x679C;&#x90FD;&#x662F;&#x901A;&#x8FC7;&#x8C03;&#x8272;&#x677F;&#x5B9E;&#x73B0;&#x7684;, &#x806A;&#x660E;&#x7684;&#x4F60;&#x77E5;&#x9053;&#x5176;&#x4E2D;&#x7684;&#x7384;&#x673A;&#x5417;?</p></div></div>
<p><code>nexus-am/am/amdev.h</code>&#x4E2D;&#x4E3A;VGA&#x5B9A;&#x4E49;&#x4E86;&#x4E24;&#x4E2A;&#x62BD;&#x8C61;&#x5BC4;&#x5B58;&#x5668;:</p>
<ul>
<li><code>_DEVREG_VIDEO_INFO</code>, AM&#x663E;&#x793A;&#x63A7;&#x5236;&#x5668;&#x4FE1;&#x606F;.
&#x4ECE;&#x4E2D;&#x8BFB;&#x51FA;<code>_DEV_VIDEO_INFO_t</code>&#x7ED3;&#x6784;&#x4F53;, &#x5176;&#x4E2D;<code>width</code>&#x4E3A;&#x5C4F;&#x5E55;&#x5BBD;&#x5EA6;, <code>height</code>&#x4E3A;&#x5C4F;&#x5E55;&#x9AD8;&#x5EA6;.
&#x53E6;&#x5916;&#x5047;&#x8BBE;AM&#x8FD0;&#x884C;&#x8FC7;&#x7A0B;&#x4E2D;, &#x5C4F;&#x5E55;&#x5927;&#x5C0F;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#x53D8;&#x5316;.</li>
<li><code>_DEVREG_VIDEO_FBCTL</code>, AM&#x5E27;&#x7F13;&#x51B2;&#x63A7;&#x5236;&#x5668;.
&#x5411;&#x5176;&#x5199;&#x5165;<code>_DEV_VIDEO_FBCTL_t</code>&#x7ED3;&#x6784;&#x4F53;, &#x5411;&#x5C4F;&#x5E55;<code>(x, y)</code>&#x5750;&#x6807;&#x5904;&#x7ED8;&#x5236;<code>w*h</code>&#x7684;&#x77E9;&#x5F62;&#x56FE;&#x50CF;.
&#x56FE;&#x50CF;&#x50CF;&#x7D20;&#x6309;&#x884C;&#x4F18;&#x5148;&#x65B9;&#x5F0F;&#x5B58;&#x50A8;&#x5728;<code>pixels</code>&#x4E2D;, &#x6BCF;&#x4E2A;&#x50CF;&#x7D20;&#x7528;32&#x4F4D;&#x6574;&#x6570;&#x4EE5;<code>00RRGGBB</code>&#x7684;&#x65B9;&#x5F0F;&#x63CF;&#x8FF0;&#x989C;&#x8272;.</li>
</ul>
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5B9E;&#x73B0;ioe3"><i class="fa fa-edit"></i> &#x5B9E;&#x73B0;IOE(3)</h5></div><div class="panel-body"><p>&#x4E8B;&#x5B9E;&#x4E0A;, VGA&#x8BBE;&#x5907;&#x8FD8;&#x6709;&#x4E24;&#x4E2A;&#x5BC4;&#x5B58;&#x5668;: &#x5C4F;&#x5E55;&#x5927;&#x5C0F;&#x5BC4;&#x5B58;&#x5668;&#x548C;&#x540C;&#x6B65;&#x5BC4;&#x5B58;&#x5668;.
&#x6211;&#x4EEC;&#x5728;&#x8BB2;&#x4E49;&#x4E2D;&#x5E76;&#x672A;&#x4ECB;&#x7ECD;&#x5B83;&#x4EEC;, &#x6211;&#x4EEC;&#x628A;&#x5B83;&#x4EEC;&#x4F5C;&#x4E3A;&#x76F8;&#x5E94;&#x7684;&#x7EC3;&#x4E60;&#x7559;&#x7ED9;&#x5927;&#x5BB6;.
&#x5177;&#x4F53;&#x5730;, &#x5C4F;&#x5E55;&#x5927;&#x5C0F;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x786C;&#x4EF6;(NEMU)&#x529F;&#x80FD;&#x5DF2;&#x7ECF;&#x5B9E;&#x73B0;, &#x4F46;&#x8F6F;&#x4EF6;(AM)&#x8FD8;&#x6CA1;&#x6709;&#x53BB;&#x4F7F;&#x7528;&#x5B83;;
&#x800C;&#x5BF9;&#x4E8E;&#x540C;&#x6B65;&#x5BC4;&#x5B58;&#x5668;&#x5219;&#x76F8;&#x53CD;, &#x8F6F;&#x4EF6;(AM)&#x5DF2;&#x7ECF;&#x5B9E;&#x73B0;&#x4E86;&#x540C;&#x6B65;&#x5C4F;&#x5E55;&#x7684;&#x529F;&#x80FD;, &#x4F46;&#x786C;&#x4EF6;(NEMU)&#x5C1A;&#x672A;&#x6DFB;&#x52A0;&#x76F8;&#x5E94;&#x7684;&#x652F;&#x6301;.</p><p>&#x597D;&#x4E86;, &#x63D0;&#x793A;&#x5DF2;&#x7ECF;&#x8DB3;&#x591F;&#x5566;, &#x81F3;&#x4E8E;&#x8981;&#x5728;&#x4EC0;&#x4E48;&#x5730;&#x65B9;&#x6DFB;&#x52A0;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#x4EE3;&#x7801;, &#x5C31;&#x7531;&#x4F60;&#x6765;RTFSC&#x5427;.
&#x8FD9;&#x4E5F;&#x662F;&#x660E;&#x767D;&#x8F6F;&#x786C;&#x4EF6;&#x5982;&#x4F55;&#x534F;&#x540C;&#x5DE5;&#x4F5C;&#x7684;&#x5F88;&#x597D;&#x7684;&#x7EC3;&#x4E60;.
&#x5B9E;&#x73B0;&#x540E;, &#x5411;<code>__am_vga_init()</code>&#x4E2D;&#x6DFB;&#x52A0;&#x5982;&#x4E0B;&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;:</p><pre><code class="lang-diff"><span class="hljs-comment">--- nexus-am/am/src/nemu-common/nemu-video.c</span>
<span class="hljs-comment">+++ nexus-am/am/src/nemu-common/nemu-video.c</span>
<span class="hljs-meta">@@ -31,2 +31,7 @@</span>
 void __am_vga_init() {
<span class="hljs-addition">+  int i;</span>
<span class="hljs-addition">+  int size = screen_width() * screen_height();</span>
<span class="hljs-addition">+  uint32_t *fb = (uint32_t *)(uintptr_t)FB_ADDR;</span>
<span class="hljs-addition">+  for (i = 0; i &lt; size; i ++) fb[i] = i;</span>
<span class="hljs-addition">+  draw_sync();</span>
 }
</code></pre><p>&#x7136;&#x540E;&#x5728;<code>$ISA-nemu</code>&#x4E2D;&#x8FD0;&#x884C;<code>amtest</code>&#x4E2D;&#x7684;<code>display test</code>&#x6D4B;&#x8BD5;.
&#x5982;&#x679C;&#x4F60;&#x7684;&#x5B9E;&#x73B0;&#x6B63;&#x786E;, &#x4F60;&#x4F1A;&#x770B;&#x5230;&#x65B0;&#x7A97;&#x53E3;&#x4E2D;&#x8F93;&#x51FA;&#x4E86;&#x5168;&#x5C4F;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;.</p></div></div>
<!-- -->
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5B9E;&#x73B0;ioe4"><i class="fa fa-edit"></i> &#x5B9E;&#x73B0;IOE(4)</h5></div><div class="panel-body"><p>&#x4E8B;&#x5B9E;&#x4E0A;, &#x521A;&#x624D;&#x8F93;&#x51FA;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;&#x5E76;&#x4E0D;&#x662F;<code>display test</code>&#x671F;&#x671B;&#x8F93;&#x51FA;&#x7684;&#x753B;&#x9762;,
&#x8FD9;&#x662F;&#x56E0;&#x4E3A;<code>_DEVREG_VIDEO_FBCTL</code>&#x7684;&#x529F;&#x80FD;&#x5E76;&#x672A;&#x6B63;&#x786E;&#x5B9E;&#x73B0;.
&#x4F60;&#x9700;&#x8981;&#x6B63;&#x786E;&#x5730;&#x5B9E;&#x73B0;<code>_DEVREG_VIDEO_FBCTL</code>&#x7684;&#x529F;&#x80FD;.
&#x5B9E;&#x73B0;&#x540E;, &#x91CD;&#x65B0;&#x8FD0;&#x884C;<code>display test</code>.
&#x5982;&#x679C;&#x4F60;&#x7684;&#x5B9E;&#x73B0;&#x6B63;&#x786E;, &#x4F60;&#x5C06;&#x4F1A;&#x770B;&#x5230;&#x65B0;&#x7A97;&#x53E3;&#x4E2D;&#x8F93;&#x51FA;&#x4E86;&#x76F8;&#x5E94;&#x7684;&#x52A8;&#x753B;&#x6548;&#x679C;.</p></div></div>
<h2 id="&#x53EF;&#x5C55;&#x793A;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;">&#x53EF;&#x5C55;&#x793A;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;</h2>
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5C55;&#x793A;&#x4F60;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;"><i class="fa fa-edit"></i> &#x5C55;&#x793A;&#x4F60;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;</h5></div><div class="panel-body"><p>&#x5B8C;&#x6574;&#x5B9E;&#x73B0;IOE&#x540E;, &#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x4E00;&#x4E9B;&#x9177;&#x70AB;&#x7684;&#x7A0B;&#x5E8F;&#x4E86;:</p><ul>
<li>&#x5E7B;&#x706F;&#x7247;&#x64AD;&#x653E;(&#x5728;<code>nexus-am/apps/slider/</code>&#x76EE;&#x5F55;&#x4E0B;).
&#x7A0B;&#x5E8F;&#x5C06;&#x6BCF;&#x9694;5&#x79D2;&#x5207;&#x6362;<code>images/</code>&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x56FE;&#x7247;.</li>
<li>&#x6253;&#x5B57;&#x5C0F;&#x6E38;&#x620F;(&#x5728;<code>nexus-am/apps/typing/</code>&#x76EE;&#x5F55;&#x4E0B;).
&#x6253;&#x5B57;&#x5C0F;&#x6E38;&#x620F;&#x6765;&#x6E90;&#x4E8E;2013&#x5E74;NJUCS oslab0&#x7684;&#x6846;&#x67B6;&#x4EE3;&#x7801;.
&#x4E3A;&#x4E86;&#x914D;&#x5408;&#x79FB;&#x690D;, &#x4EE3;&#x7801;&#x7684;&#x7ED3;&#x6784;&#x505A;&#x4E86;&#x5C11;&#x91CF;&#x8C03;&#x6574;, &#x540C;&#x65F6;&#x5BF9;&#x5C4F;&#x5E55;&#x66F4;&#x65B0;&#x8FDB;&#x884C;&#x4E86;&#x4F18;&#x5316;, &#x5E76;&#x53BB;&#x6389;&#x4E86;&#x6D6E;&#x70B9;&#x6570;.</li>
</ul><p><img src="images/Typing.png" alt="typing"></p></div></div>
<p>&#x6709;&#x5174;&#x8DA3;&#x6298;&#x817E;&#x7684;&#x540C;&#x5B66;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x5728;NEMU&#x4E2D;&#x8FD0;&#x884C;LiteNES(&#x5728;<code>nexus-am/apps/litenes/</code>&#x76EE;&#x5F55;&#x4E0B;).
&#x6CA1;&#x9519;, &#x6211;&#x4EEC;&#x5728;PA1&#x7ED9;&#x5927;&#x5BB6;&#x4ECB;&#x7ECD;&#x7684;&#x7EA2;&#x767D;&#x673A;&#x6A21;&#x62DF;&#x5668;, &#x73B0;&#x5728;&#x4E5F;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x5728;NEMU&#x4E2D;&#x8FD0;&#x884C;&#x8D77;&#x6765;&#x4E86;!</p>
<div class="panel panel-success"><div class="panel-heading"><h5 class="panel-title" id="&#x4F53;&#x4F1A;&#x5230;am&#x7684;&#x597D;&#x5904;&#x4E86;&#x5427;"><i class="fa fa-lightbulb-o"></i> &#x4F53;&#x4F1A;&#x5230;AM&#x7684;&#x597D;&#x5904;&#x4E86;&#x5427;?</h5></div><div class="panel-body"><p>&#x542C;&#x95FB;&#x8FD9;&#x5B66;&#x671F;&#x7684;&#x6570;&#x5B57;&#x7535;&#x8DEF;&#x5B9E;&#x9A8C;&#x7684;&#x5927;&#x4F5C;&#x4E1A;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x5355;&#x5468;&#x671F;CPU.
&#x73B0;&#x5728;&#x6709;&#x4E86;&#x8FD9;&#x4E48;&#x591A;&#x4E30;&#x5BCC;&#x7684;AM&#x5E94;&#x7528;, &#x5173;&#x952E;&#x662F;&#x8FD9;&#x4E9B;AM&#x5E94;&#x7528;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x5730;&#x79FB;&#x690D;&#x5230;&#x4EFB;&#x610F;&#x67B6;&#x6784;,
&#x5728;&#x81EA;&#x5DF1;&#x8BBE;&#x8BA1;&#x7684;CPU&#x4E0A;&#x8FD0;&#x884C;&#x8D85;&#x7EA7;&#x739B;&#x4E3D;, &#x5C55;&#x793A;&#x6548;&#x679C;&#x9177;&#x70AB;&#x5F97;&#x8981;&#x4E0A;&#x5929;!</p><p>AM&#x5C31;&#x662F;&#x4E3A;&#x6559;&#x5B66;&#x5B9E;&#x9A8C;&#x800C;&#x751F;. &#x65E2;&#x7136;&#x8FD9;&#x6837;, &#x4F60;&#x8FD8;&#x7B49;&#x4EC0;&#x4E48;&#x5462;?</p></div></div>
<!-- -->
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="litenes&#x5982;&#x4F55;&#x5DE5;&#x4F5C;"><i class="fa fa-question-circle"></i> LiteNES&#x5982;&#x4F55;&#x5DE5;&#x4F5C;?</h5></div><div class="panel-body"><p>&#x9605;&#x8BFB;<code>nexus-am/apps/litenes/src/cpu.c</code>&#x7684;&#x4EE3;&#x7801;, &#x4F60;&#x6709;&#x4EC0;&#x4E48;&#x65B0;&#x7684;&#x53D1;&#x73B0;?</p></div></div>
<!-- -->
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x4F18;&#x5316;litenes"><i class="fa fa-question-circle"></i> &#x4F18;&#x5316;LiteNES</h5></div><div class="panel-body"><p>&#x6211;&#x4EEC;&#x5728;LiteNES&#x4E2D;&#x8BBE;&#x7F6E;&#x4E86;&#x8DF3;&#x5E27;&#x6A21;&#x5F0F;, &#x5728;&#x7F16;&#x8BD1;&#x5230;<code>native</code>&#x4E4B;&#x5916;&#x7684;&#x5E73;&#x53F0;&#x65F6;,
&#x4F1A;&#x9ED8;&#x8BA4;&#x5F00;&#x542F;&#x8DF3;&#x5E27;&#x6A21;&#x5F0F;, &#x53EA;&#x6E32;&#x67D3;1/3&#x7684;&#x5E27;.
&#x867D;&#x7136;&#x5728;<code>native</code>&#x4E0A;&#x53EF;&#x4EE5;&#x8DD1;&#x6EE1;60FPS, &#x4F46;&#x5373;&#x4F7F;&#x5F00;&#x542F;&#x8DF3;&#x5E27;&#x6A21;&#x5F0F;, &#x5728;NEMU&#x4E2D;&#x4E5F;&#x53EA;&#x80FD;&#x8DD1;&#x51E0;FPS.</p><p>NEMU&#x7684;&#x6027;&#x80FD;&#x786E;&#x5B9E;&#x4E0D;&#x9AD8;, &#x4F46;LiteNES&#x4E5F;&#x662F;&#x534A;&#x65A4;&#x516B;&#x4E24;, &#x4EE3;&#x7801;&#x8FD8;&#x6709;&#x975E;&#x5E38;&#x591A;&#x53EF;&#x4EE5;&#x4F18;&#x5316;&#x7684;&#x7A7A;&#x95F4;.
&#x5982;&#x679C;&#x4F60;&#x5C06;&#x6765;&#x6253;&#x7B97;&#x5728;&#x81EA;&#x5DF1;&#x8BBE;&#x8BA1;&#x7684;CPU&#x4E0A;&#x8FD0;&#x884C;LiteNES, &#x90A3;&#x4E48;&#x6765;&#x5BF9;LiteNES&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x4E5F;&#x4E0D;&#x4F1A;&#x5403;&#x4E8F;.</p><p>&#x6211;&#x4EEC;&#x624B;&#x4E0A;&#x6709;&#x4E00;&#x4E2A;&#x7ECF;&#x8FC7;&#x66B4;&#x529B;&#x4F18;&#x5316;&#x7684;LiteNES,
&#x5B83;&#x5728;microbench&#x8DD1;&#x5206;&#x4E3A;<code>236</code>&#x5206;&#x7684;<code>x86-nemu</code>&#x4E0A;&#x4E5F;&#x53EF;&#x4EE5;&#x8DD1;&#x6EE1;60 FPS,
&#x5728;microbench&#x8DD1;&#x5206;&#x4E3A;<code>400</code>&#x5206;&#x7684;<code>riscv32-nemu</code>&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x8DD1;&#x5230;100 FPS!
&#x6709;&#x4E86;&#x8FD9;&#x4E2A;&#x66B4;&#x529B;&#x4F18;&#x5316;&#x7248;&#x672C;, &#x5728;FPGA&#x4E0A;&#x5C31;&#x53EF;&#x4EE5;&#x6D41;&#x7545;&#x5730;&#x8FD0;&#x884C;&#x8D85;&#x7EA7;&#x739B;&#x4E3D;&#x4E86;.</p><p>&#x4E3A;&#x4E86;&#x5C3D;&#x53EF;&#x80FD;&#x5C4F;&#x853D;&#x771F;&#x673A;&#x548C;NEMU&#x5B9E;&#x73B0;&#x5E26;&#x6765;&#x7684;&#x6027;&#x80FD;&#x5DEE;&#x5F02;, &#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x8BB0;&#x5F55;FPS&#x7684;&#x540C;&#x65F6;,
&#x628A;microbench&#x7684;&#x8DD1;&#x5206;&#x4E5F;&#x4E00;&#x540C;&#x8BB0;&#x5F55;&#x4E0B;&#x6765;, &#x7136;&#x540E;&#x8BA1;&#x7B97;<code>FPS/&#x8DD1;&#x5206;</code>&#x8FD9;&#x4E2A;&#x6307;&#x6807;,
&#x6765;&#x8861;&#x91CF;&#x5355;&#x4F4D;&#x8BA1;&#x7B97;&#x80FD;&#x529B;&#x8D21;&#x732E;&#x7684;FPS, &#x901A;&#x8FC7;&#x5B83;&#x53EF;&#x4EE5;&#x5927;&#x81F4;&#x53CD;&#x6620;&#x51FA;LiteNES&#x672C;&#x8EAB;&#x7684;&#x6027;&#x80FD;.
&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x4E0A;&#x624B;&#x7684;&#x66B4;&#x529B;&#x4F18;&#x5316;&#x7248;&#x672C;, &#x5728;<code>x86-nemu</code>&#x4E0A;&#x8BA1;&#x7B97;&#x8FD9;&#x4E2A;&#x6307;&#x6807;, &#x7ED3;&#x679C;&#x662F;<code>60/236 = 0.2542</code>;
&#x800C;&#x5728;<code>riscv32-nemu</code>&#x4E0A;&#x8BA1;&#x7B97;&#x5219;&#x662F;<code>100/400 = 0.2500</code>, &#x7ED3;&#x679C;&#x8FD8;&#x662F;&#x6BD4;&#x8F83;&#x4E00;&#x81F4;&#x7684;.</p><p>&#x6211;&#x4EEC;&#x63D0;&#x4F9B;<a href="https://wiki.nesdev.com/w/index.php/CPU" target="_blank">6502&#x5904;&#x7406;&#x5668;(NES&#x7684;CPU)</a>&#x4EE5;&#x53CA;<a href="https://wiki.nesdev.com/w/index.php/PPU" target="_blank">NES PPU(&#x56FE;&#x5F62;&#x5904;&#x7406;&#x5668;)</a>&#x7684;&#x8D44;&#x6599;&#x4F9B;&#x53C2;&#x8003;.
&#x5982;&#x679C;&#x4F60;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x4E86;&#x5FC5;&#x505A;&#x7684;&#x5185;&#x5BB9;&#x800C;&#x53C8;&#x95F2;&#x6765;&#x65E0;&#x4E8B;, &#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x6765;&#x4F18;&#x5316;LiteNES&#x7684;&#x4EE3;&#x7801;,
&#x5E76;&#x548C;&#x5C0F;&#x4F19;&#x4F34;PK&#x4F18;&#x5316;&#x540E;&#x7684;&#x6027;&#x80FD;&#x5427;! &#x4E0D;&#x8FC7;, &#x4F60;&#x6253;&#x7B97;&#x600E;&#x4E48;&#x6765;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x5462;?</p></div></div>
<p>&#x4E8B;&#x5B9E;&#x4E0A;, &#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x51AF;&#x8BFA;&#x4F9D;&#x66FC;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;!
&#x4F60;&#x5DF2;&#x7ECF;&#x5728;&#x5BFC;&#x8BBA;&#x8BFE;&#x4E0A;&#x5B66;&#x4E60;&#x5230;, &#x51AF;&#x8BFA;&#x4F9D;&#x66FC;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7531;5&#x4E2A;&#x90E8;&#x4EF6;&#x7EC4;&#x6210;:
&#x8FD0;&#x7B97;&#x5668;, &#x63A7;&#x5236;&#x5668;, &#x5B58;&#x50A8;&#x5668;, &#x8F93;&#x5165;&#x8BBE;&#x5907;&#x548C;&#x8F93;&#x51FA;&#x8BBE;&#x5907;.
&#x4F55;&#x51B5;&#x8FD9;&#x4E9B;&#x548B;&#x542C;&#x4E4B;&#x4E0B;&#x8BA9;&#x4EBA;&#x4E91;&#x91CC;&#x96FE;&#x91CC;&#x7684;&#x540D;&#x8BCD;, &#x73B0;&#x5728;&#x90FD;&#x5DF2;&#x7ECF;&#x8DC3;&#x7136;&quot;&#x7801;&quot;&#x4E0A;: &#x4F60;&#x5DF2;&#x7ECF;&#x5728;NEMU&#x4E2D;&#x628A;&#x5B83;&#x4EEC;&#x90FD;&#x5B9E;&#x73B0;&#x4E86;!
&#x518D;&#x56DE;&#x8FC7;&#x5934;&#x6765;&#x5BA1;&#x89C6;&#x8FD9;&#x4E00;&#x65E2;&#x7B80;&#x5355;&#x53C8;&#x590D;&#x6742;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;:
&#x8BF4;&#x5B83;&#x7B80;&#x5355;, &#x5B83;&#x53EA;&#x4E0D;&#x8FC7;&#x5728;TRM&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x6DFB;&#x52A0;&#x4E86;IOE,
&#x672C;&#x8D28;&#x4E0A;&#x8FD8;&#x662F;&quot;&#x53D6;&#x6307;-&gt;&#x8BD1;&#x7801;-&gt;&#x6267;&#x884C;&quot;&#x7684;&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;,
&#x751A;&#x81F3;&#x53EA;&#x8981;&#x5177;&#x5907;&#x4E00;&#x4E9B;&#x6570;&#x5B57;&#x7535;&#x8DEF;&#x7684;&#x77E5;&#x8BC6;&#x5C31;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x6784;&#x5EFA;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x53EF;&#x80FD;&#x6027;;
&#x8BF4;&#x5B83;&#x590D;&#x6742;, &#x5B83;&#x5374;&#x5DF2;&#x7ECF;&#x8DB3;&#x591F;&#x5F3A;&#x5927;&#x6765;&#x652F;&#x6491;&#x8FD9;&#x4E48;&#x591A;&#x9177;&#x70AB;&#x7684;&#x7A0B;&#x5E8F;, &#x5B9E;&#x5728;&#x662F;&#x8BA9;&#x4EBA;&#x6FC0;&#x52A8;&#x4E0D;&#x5DF2;&#x554A;!
&#x90A3;&#x4E9B;&#x770B;&#x4F3C;&#x7B80;&#x5355;&#x4F46;&#x53C8;&#x53EF;&#x4EE5;&#x6298;&#x5C04;&#x51FA;&#x65E0;&#x9650;&#x53EF;&#x80FD;&#x7684;&#x4E8B;&#x7269;,
&#x5176;&#x4E2D;&#x627F;&#x8F7D;&#x7684;&#x7F8E;&#x5999;&#x89C4;&#x5F8B;&#x5BB9;&#x6613;&#x4F7F;&#x4EBA;&#x4EEC;&#x4E3A;&#x4E4B;&#x9676;&#x9189;, &#x4E3A;&#x4E4B;&#x6298;&#x670D;.
&#x8BA1;&#x7B97;&#x673A;, &#x5C31;&#x662F;&#x5176;&#x4E2D;&#x4E4B;&#x4E00;.</p>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="&#x4E07;&#x53D8;&#x4E4B;&#x5B97;"><i class="fa fa-comment-o"></i> &#x4E07;&#x53D8;&#x4E4B;&#x5B97;</h5></div><div class="panel-body"><p>&#x5982;&#x679C;&#x4F60;&#x770B;&#x5230;&#x4E86;&#x8FD9;&#x91CC;, &#x76F8;&#x4FE1;&#x4F60;&#x4E5F;&#x77E5;&#x9053;&#x8BA1;&#x7B97;&#x673A;&#x662F;&#x600E;&#x4E48;&#x8FD0;&#x884C;&#x7684;&#x4E86;.
&#x5982;&#x679C;&#x4F60;&#x53BB;&#x9605;&#x8BFB;&#x4E0A;&#x6587;&#x63D0;&#x4F9B;&#x7684;NES CPU&#x8D44;&#x6599;, &#x4F60;&#x5C31;&#x4F1A;&#x53D1;&#x73B0;&#x5F88;&#x591A;&#x6982;&#x5FF5;&#x662F;&#x591A;&#x4E48;&#x5730;&#x719F;&#x6089;;
&#x5982;&#x679C;&#x4F60;&#x53BB;RTFSC, &#x4F60;&#x5C31;&#x4F1A;&#x53D1;&#x73B0;&#x6709;&#x5F88;&#x591A;&#x4EE3;&#x7801;&#x90FD;&#x548C;NEMU&#x6709;&#x7740;&#x5343;&#x4E1D;&#x4E07;&#x7F15;&#x7684;&#x8054;&#x7CFB;.</p><p>&#x8FD9;&#x662F;&#x56E0;&#x4E3A;, LiteNES&#x548C;NEMU&#x4E00;&#x6837;, &#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;.</p></div></div>
<!-- -->
<div class="panel panel-warning"><div class="panel-heading"><h5 class="panel-title" id="&#x5FC5;&#x7B54;&#x9898;"><i class="fa fa-edit"></i> &#x5FC5;&#x7B54;&#x9898;</h5></div><div class="panel-body"><p>&#x4F60;&#x9700;&#x8981;&#x5728;&#x5B9E;&#x9A8C;&#x62A5;&#x544A;&#x4E2D;&#x7528;&#x81EA;&#x5DF1;&#x7684;&#x8BED;&#x8A00;, &#x5C3D;&#x53EF;&#x80FD;&#x8BE6;&#x7EC6;&#x5730;&#x56DE;&#x7B54;&#x4E0B;&#x5217;&#x95EE;&#x9898;.</p><ul>
<li><u>RTFSC</u>
&#x8BF7;&#x6574;&#x7406;&#x4E00;&#x6761;&#x6307;&#x4EE4;&#x5728;NEMU&#x4E2D;&#x7684;&#x6267;&#x884C;&#x8FC7;&#x7A0B;. (&#x6211;&#x4EEC;&#x5176;&#x5B9E;&#x5DF2;&#x7ECF;&#x5728;PA2.1&#x9636;&#x6BB5;&#x63D0;&#x5230;&#x8FC7;&#x8FD9;&#x9053;&#x9898;&#x4E86;)</li>
<li><u>&#x7F16;&#x8BD1;&#x4E0E;&#x94FE;&#x63A5;</u>
&#x5728;<code>nemu/include/rtl/rtl.h</code>&#x4E2D;, &#x4F60;&#x4F1A;&#x770B;&#x5230;&#x7531;<code>static inline</code>&#x5F00;&#x5934;&#x5B9A;&#x4E49;&#x7684;&#x5404;&#x79CD;RTL&#x6307;&#x4EE4;&#x51FD;&#x6570;.
&#x9009;&#x62E9;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x51FD;&#x6570;, &#x5206;&#x522B;&#x5C1D;&#x8BD5;&#x53BB;&#x6389;<code>static</code>, &#x53BB;&#x6389;<code>inline</code>&#x6216;&#x53BB;&#x6389;&#x4E24;&#x8005;, &#x7136;&#x540E;&#x91CD;&#x65B0;&#x8FDB;&#x884C;&#x7F16;&#x8BD1;, &#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x770B;&#x5230;&#x53D1;&#x751F;&#x9519;&#x8BEF;.
&#x8BF7;&#x5206;&#x522B;&#x89E3;&#x91CA;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD9;&#x4E9B;&#x9519;&#x8BEF;&#x4F1A;&#x53D1;&#x751F;/&#x4E0D;&#x53D1;&#x751F;? &#x4F60;&#x6709;&#x529E;&#x6CD5;&#x8BC1;&#x660E;&#x4F60;&#x7684;&#x60F3;&#x6CD5;&#x5417;?</li>
<li><u>&#x7F16;&#x8BD1;&#x4E0E;&#x94FE;&#x63A5;</u><ol>
<li>&#x5728;<code>nemu/include/common.h</code>&#x4E2D;&#x6DFB;&#x52A0;&#x4E00;&#x884C;<code>volatile static int dummy;</code> &#x7136;&#x540E;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;NEMU.
&#x8BF7;&#x95EE;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x540E;&#x7684;NEMU&#x542B;&#x6709;&#x591A;&#x5C11;&#x4E2A;<code>dummy</code>&#x53D8;&#x91CF;&#x7684;&#x5B9E;&#x4F53;? &#x4F60;&#x662F;&#x5982;&#x4F55;&#x5F97;&#x5230;&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x7684;?</li>
<li>&#x6DFB;&#x52A0;&#x4E0A;&#x9898;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x540E;, &#x518D;&#x5728;<code>nemu/include/debug.h</code>&#x4E2D;&#x6DFB;&#x52A0;&#x4E00;&#x884C;<code>volatile static int dummy;</code> &#x7136;&#x540E;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;NEMU.
&#x8BF7;&#x95EE;&#x6B64;&#x65F6;&#x7684;NEMU&#x542B;&#x6709;&#x591A;&#x5C11;&#x4E2A;<code>dummy</code>&#x53D8;&#x91CF;&#x7684;&#x5B9E;&#x4F53;? &#x4E0E;&#x4E0A;&#x9898;&#x4E2D;<code>dummy</code>&#x53D8;&#x91CF;&#x5B9E;&#x4F53;&#x6570;&#x76EE;&#x8FDB;&#x884C;&#x6BD4;&#x8F83;, &#x5E76;&#x89E3;&#x91CA;&#x672C;&#x9898;&#x7684;&#x7ED3;&#x679C;.</li>
<li>&#x4FEE;&#x6539;&#x6DFB;&#x52A0;&#x7684;&#x4EE3;&#x7801;, &#x4E3A;&#x4E24;&#x5904;<code>dummy</code>&#x53D8;&#x91CF;&#x8FDB;&#x884C;&#x521D;&#x59CB;&#x5316;:<code>volatile static int dummy = 0;</code> &#x7136;&#x540E;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;NEMU.
&#x4F60;&#x53D1;&#x73B0;&#x4E86;&#x4EC0;&#x4E48;&#x95EE;&#x9898;? &#x4E3A;&#x4EC0;&#x4E48;&#x4E4B;&#x524D;&#x6CA1;&#x6709;&#x51FA;&#x73B0;&#x8FD9;&#x6837;&#x7684;&#x95EE;&#x9898;? (&#x56DE;&#x7B54;&#x5B8C;&#x672C;&#x9898;&#x540E;&#x53EF;&#x4EE5;&#x5220;&#x9664;&#x6DFB;&#x52A0;&#x7684;&#x4EE3;&#x7801;.)</li>
</ol>
</li>
<li><u>&#x4E86;&#x89E3;Makefile</u>
&#x8BF7;&#x63CF;&#x8FF0;&#x4F60;&#x5728;<code>nemu/</code>&#x76EE;&#x5F55;&#x4E0B;&#x6572;&#x5165;<code>make</code> &#x540E;, <code>make</code>&#x7A0B;&#x5E8F;&#x5982;&#x4F55;&#x7EC4;&#x7EC7;.c&#x548C;.h&#x6587;&#x4EF6;,
&#x6700;&#x7EC8;&#x751F;&#x6210;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;<code>nemu/build/$ISA-nemu</code>.
(&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x5305;&#x62EC;&#x4E24;&#x4E2A;&#x65B9;&#x9762;:<code>Makefile</code>&#x7684;&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;&#x548C;&#x7F16;&#x8BD1;&#x94FE;&#x63A5;&#x7684;&#x8FC7;&#x7A0B;.)
&#x5173;&#x4E8E;<code>Makefile</code>&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;&#x7684;&#x63D0;&#x793A;:<ul>
<li><code>Makefile</code>&#x4E2D;&#x4F7F;&#x7528;&#x4E86;&#x53D8;&#x91CF;, &#x5305;&#x542B;&#x6587;&#x4EF6;&#x7B49;&#x7279;&#x6027;</li>
<li><code>Makefile</code>&#x8FD0;&#x7528;&#x5E76;&#x91CD;&#x5199;&#x4E86;&#x4E00;&#x4E9B;implicit rules</li>
<li>&#x5728;<code>man make</code>&#x4E2D;&#x641C;&#x7D22;<code>-n</code>&#x9009;&#x9879;, &#x4E5F;&#x8BB8;&#x4F1A;&#x5BF9;&#x4F60;&#x6709;&#x5E2E;&#x52A9;</li>
<li>RTFM</li>
</ul>
</li>
</ul></div></div>
<!-- -->
<div class="panel panel-success"><div class="panel-heading"><h5 class="panel-title" id="&#x6E29;&#x99A8;&#x63D0;&#x793A;"><i class="fa fa-flag"></i> &#x6E29;&#x99A8;&#x63D0;&#x793A;</h5></div><div class="panel-body"><p>PA2&#x5230;&#x6B64;&#x7ED3;&#x675F;. &#x8BF7;&#x4F60;&#x7F16;&#x5199;&#x597D;&#x5B9E;&#x9A8C;&#x62A5;&#x544A;(&#x4E0D;&#x8981;&#x5FD8;&#x8BB0;&#x5728;&#x5B9E;&#x9A8C;&#x62A5;&#x544A;&#x4E2D;&#x56DE;&#x7B54;&#x5FC5;&#x7B54;&#x9898;),
&#x7136;&#x540E;&#x628A;&#x547D;&#x540D;&#x4E3A;<code>&#x5B66;&#x53F7;.pdf</code>&#x7684;&#x5B9E;&#x9A8C;&#x62A5;&#x544A;&#x6587;&#x4EF6;&#x653E;&#x7F6E;&#x5728;&#x5DE5;&#x7A0B;&#x76EE;&#x5F55;&#x4E0B;,
&#x6267;&#x884C;<code>make submit</code>&#x5BF9;&#x5DE5;&#x7A0B;&#x8FDB;&#x884C;&#x6253;&#x5305;, &#x6700;&#x540E;&#x5C06;&#x538B;&#x7F29;&#x5305;&#x63D0;&#x4EA4;&#x5230;&#x6307;&#x5B9A;&#x7F51;&#x7AD9;.</p></div></div>
<footer class="page-footer-ex"> <span class="page-footer-ex-copyright"> By <a href="https://sashimi-yzh.github.io/" target="_blank">Zihao Yu</a>, &#x91C7;&#x7528;<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/" target="_blank">&#x77E5;&#x8BC6;&#x5171;&#x4EAB; &#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528;-&#x76F8;&#x540C;&#x65B9;&#x5F0F;&#x5171;&#x4EAB; 3.0 &#x4E2D;&#x56FD;&#x5927;&#x9646; &#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a>&#x53D1;&#x5E03; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class="page-footer-ex-footer-update"> &#x6B64;&#x9875;&#x9762;&#x4FEE;&#x8BA2;&#x4E8E;:  2019-10-25 20:02:34 </span> </footer>
                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="2.4.html" class="navigation navigation-prev " aria-label="Previous page: 基础设施(2)">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="PA3.html" class="navigation navigation-next " aria-label="Next page: PA3 - 穿越时空的旅程: 批处理系统">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"输入输出","level":"1.4.5","depth":2,"next":{"title":"PA3 - 穿越时空的旅程: 批处理系统","level":"1.5","depth":1,"path":"PA3.md","ref":"PA3.md","articles":[{"title":"最简单的操作系统","level":"1.5.1","depth":2,"path":"3.1.md","ref":"3.1.md","articles":[]},{"title":"穿越时空的旅程","level":"1.5.2","depth":2,"path":"3.2.md","ref":"3.2.md","articles":[]},{"title":"用户程序和系统调用","level":"1.5.3","depth":2,"path":"3.3.md","ref":"3.3.md","articles":[]},{"title":"文件系统","level":"1.5.4","depth":2,"path":"3.4.md","ref":"3.4.md","articles":[]},{"title":"批处理系统","level":"1.5.5","depth":2,"path":"3.5.md","ref":"3.5.md","articles":[]}]},"previous":{"title":"基础设施(2)","level":"1.4.4","depth":2,"path":"2.4.md","ref":"2.4.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"3.x.x","theme":"default","variables":{},"plugins":["theme-comscore","intopic-toc","localized-footer","page-footer-ex","callouts"],"pluginsConfig":{"callouts":{"option":{"alert":"info","picto":"fa-edit"},"flag":{"alert":"success","picto":"fa-flag"},"question":{"alert":"info","picto":"fa-question-circle"},"info":{"alert":"info","picto":"fa-info-circle"},"todo":{"alert":"warning","picto":"fa-edit"},"caution":{"alert":"danger","picto":"fa-bullhorn"},"danger":{"alert":"danger","picto":"fa-exclamation"},"showTypeInHeader":false},"intopic-toc":{"label":"导航","selector":".markdown-section h2, .markdown-section h3, .markdown-section h4","visible":true},"page-footer-ex":{"copyright":"By [Zihao Yu](https://sashimi-yzh.github.io/), 采用[知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/)发布","markdown":true,"update_format":"YYYY-MM-DD HH:mm:ss","update_label":"此页面修订于: "},"search":{},"localized-footer":{"filename":"FOOTER.md","hline":"true"},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"theme-comscore":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles.css","pdf":"styles.css"}},"file":{"path":"2.5.md","mtime":"2019-10-25T12:02:34.979Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-02-09T13:32:13.968Z"},"basePath":".","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="gitbook/gitbook.js"></script>
    <script src="gitbook/theme.js"></script>
    
        
        <script src="gitbook/gitbook-plugin-intopic-toc/anchor.min.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-intopic-toc/gumshoe.min.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-intopic-toc/plugin.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-theme-comscore/test.js"></script>
        
    

    </body>
</html>

